Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
authorSapan Bhatia <gwsapan@gmail.com>
Wed, 11 Jun 2014 17:27:49 +0000 (13:27 -0400)
committerSapan Bhatia <gwsapan@gmail.com>
Wed, 11 Jun 2014 17:27:49 +0000 (13:27 -0400)
Conflicts:
planetstack/apigen/api.template.py

207 files changed:
Makefile [new file with mode: 0644]
opencloud.spec [new file with mode: 0644]
planetstack/apigen/api.template.py
planetstack/cassandra/__init__.py [new file with mode: 0644]
planetstack/cassandra/admin.py [new file with mode: 0644]
planetstack/cassandra/models.py [new file with mode: 0644]
planetstack/core/acl.py [new file with mode: 0644]
planetstack/core/admin.py
planetstack/core/context_processors.py [new file with mode: 0644]
planetstack/core/dashboard/__init__.py [moved from planetstack/core/plus/__init__.py with 100% similarity]
planetstack/core/dashboard/sites.py [new file with mode: 0644]
planetstack/core/dashboard/views/__init__.py [new file with mode: 0644]
planetstack/core/dashboard/views/analytics.py [new file with mode: 0644]
planetstack/core/dashboard/views/cdn.py [new file with mode: 0644]
planetstack/core/dashboard/views/customize.py [new file with mode: 0644]
planetstack/core/dashboard/views/home.py [new file with mode: 0644]
planetstack/core/dashboard/views/interactions.py [new file with mode: 0644]
planetstack/core/dashboard/views/simulator.py [new file with mode: 0644]
planetstack/core/dashboard/views/tenant.py [new file with mode: 0644]
planetstack/core/dashboard/views/test.py [new file with mode: 0644]
planetstack/core/dashboard/views/view_common.py [new file with mode: 0644]
planetstack/core/fixtures/demo_data.json
planetstack/core/fixtures/initial_data.json
planetstack/core/models/__init__.py
planetstack/core/models/dashboard.py [new file with mode: 0644]
planetstack/core/models/deployment.py [deleted file]
planetstack/core/models/image.py
planetstack/core/models/network.py
planetstack/core/models/plcorebase.py
planetstack/core/models/reservation.py
planetstack/core/models/serviceclass.py
planetstack/core/models/site.py
planetstack/core/models/slice.py
planetstack/core/models/slicetag.py
planetstack/core/models/sliver.py
planetstack/core/models/tag.py
planetstack/core/models/user.py
planetstack/core/plus/sites.py [deleted file]
planetstack/core/plus/views.py [deleted file]
planetstack/core/serializers.py
planetstack/core/static/chartsBg.jpg [new file with mode: 0644]
planetstack/core/static/hpc_historical.css [new file with mode: 0644]
planetstack/core/static/img/bg_left_white.gif [new file with mode: 0644]
planetstack/core/static/js/Leaflet.MakiMarkers.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/changelog.txt [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/console.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/console_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/demos/basic.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/demos/blank.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/demos/index.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/demos/inpage.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/demos/lite.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/backwardsincompatibilities.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/distribution.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/index.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/lite.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/manual.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/manual_lite.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/quickstart.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/docs/whatsnew.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/examples/demo.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/examples/example_manual.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/examples/example_quickstart_1.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/examples/myloggingservlet.do [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/console.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/console_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/liteconsole.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/liteconsole_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/log4javascript_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/license.txt [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/log4javascript.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/log4javascript_uncompressed.js [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/main.css [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/index.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/log4javascript_uncompressed.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/main.html [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/tests.css [new file with mode: 0644]
planetstack/core/static/log4javascript-1.4.6/test/xntest.js [new file with mode: 0644]
planetstack/core/static/main.js [new file with mode: 0644]
planetstack/core/static/page_analytics.js [new file with mode: 0644]
planetstack/core/static/planetstack.css
planetstack/core/static/planetstack_graphs.js [new file with mode: 0644]
planetstack/core/static/planetstack_graphs_old.js [new file with mode: 0644]
planetstack/deployment_auth.py [new file with mode: 0644]
planetstack/dmdot [changed mode: 0755->0644]
planetstack/hpc/admin.py
planetstack/hpc/models.py
planetstack/hpc_wizard/README [new file with mode: 0644]
planetstack/hpc_wizard/bigquery_analytics.py [new file with mode: 0644]
planetstack/hpc_wizard/hpc_wizard.py [new file with mode: 0644]
planetstack/hpc_wizard/planetstack_analytics.py [new file with mode: 0644]
planetstack/hpc_wizard/query.py [new file with mode: 0644]
planetstack/kairos/__init__.py [new file with mode: 0644]
planetstack/kairos/admin.py [new file with mode: 0644]
planetstack/kairos/models.py [new file with mode: 0644]
planetstack/nagios/__init__.py [new file with mode: 0644]
planetstack/nagios/admin.py [new file with mode: 0644]
planetstack/nagios/models.py [new file with mode: 0644]
planetstack/nginx/planetstack.conf [new file with mode: 0644]
planetstack/observer/__init__.py
planetstack/observer/backend.py
planetstack/observer/deleters/network_deleter.py
planetstack/observer/deleters/network_deployment_deleter.py [new file with mode: 0644]
planetstack/observer/deleters/site_deleter.py
planetstack/observer/deleters/site_deployment_deleter.py [new file with mode: 0644]
planetstack/observer/deleters/slice_deleter.py
planetstack/observer/deleters/slice_deployment_deleter.py [new file with mode: 0644]
planetstack/observer/deleters/sliver_deleter.py
planetstack/observer/deleters/user_deleter.py
planetstack/observer/deleters/user_deployment_deleter.py [new file with mode: 0644]
planetstack/observer/event_loop.py
planetstack/observer/event_manager.py
planetstack/observer/steps/__init__.py
planetstack/observer/steps/garbage_collector.py
planetstack/observer/steps/sync_image_deployments.py [new file with mode: 0644]
planetstack/observer/steps/sync_images.py
planetstack/observer/steps/sync_network_deployments.py [new file with mode: 0644]
planetstack/observer/steps/sync_network_slivers.py
planetstack/observer/steps/sync_networks.py
planetstack/observer/steps/sync_nodes.py
planetstack/observer/steps/sync_roles.py
planetstack/observer/steps/sync_site_deployments.py [new file with mode: 0644]
planetstack/observer/steps/sync_site_privileges.py
planetstack/observer/steps/sync_sites.py
planetstack/observer/steps/sync_slice_deployments.py [new file with mode: 0644]
planetstack/observer/steps/sync_slice_memberships.py
planetstack/observer/steps/sync_slices.py
planetstack/observer/steps/sync_sliver_ips.py
planetstack/observer/steps/sync_slivers.py
planetstack/observer/steps/sync_user_deployments.py [new file with mode: 0644]
planetstack/observer/steps/sync_users.py
planetstack/observer/syncstep.py
planetstack/observer/toposort.py [changed mode: 0755->0644]
planetstack/openstack/client.py
planetstack/openstack/driver.py
planetstack/planetstack-backend.py
planetstack/planetstack-config.py [new file with mode: 0755]
planetstack/planetstack/settings.py
planetstack/planetstack/urls.py
planetstack/plstackapi_config
planetstack/requestrouter/admin.py
planetstack/requestrouter/models.py
planetstack/rr_observer/configurationPush.py [new file with mode: 0644]
planetstack/rr_observer/deleters/servicemap_deleter.py [new file with mode: 0644]
planetstack/rr_observer/model-deps [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_demux/handlers/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_demux/tasks/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_demux/vars/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_redir/handlers/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_redir/tasks/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/delete_redir/vars/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/demux/handlers/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/demux/tasks/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/demux/vars/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/redir/handlers/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/redir/tasks/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/roles/redir/vars/main.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/site_demux.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/site_demux_delete.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/site_redir.yml [new file with mode: 0644]
planetstack/rr_observer/playbook/site_redir_delete.yml [new file with mode: 0644]
planetstack/rr_observer/rr_observer_config [new file with mode: 0644]
planetstack/rr_observer/rrlib.py [new file with mode: 0644]
planetstack/rr_observer/rrlib_config.py [new file with mode: 0644]
planetstack/rr_observer/steps/sync_requestrouterservices.py [new file with mode: 0644]
planetstack/rr_observer/steps/sync_servicemap.py [new file with mode: 0644]
planetstack/scripts/opencloud [new file with mode: 0755]
planetstack/syndicate/admin.py
planetstack/syndicate/models.py
planetstack/templates/admin/base.html
planetstack/templates/admin/dashboard/cdn_nodes.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/cdnoperations.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/customize.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/dashboard_base.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/developer.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/hpc_historical.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/slice_interactions.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/tenant.html [new file with mode: 0644]
planetstack/templates/admin/dashboard/welcome.html
planetstack/templates/admin/login.html
planetstack/templates/admin/newminidashboard.html [new file with mode: 0644]
planetstack/templates/admin/request_account.html [new file with mode: 0644]
planetstack/tests/GetConfiguration.py
planetstack/tests/generate_billing_sample.py
planetstack/uwsgi/planetstack.ini [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..86fe485
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,53 @@
+NAME = opencloud
+SPECFILE = $(NAME).spec
+VERSION = $(shell rpm -q --specfile $(SPECFILE) --qf '%{VERSION}\n' | head -n 1)
+RELEASE = $(shell rpm -q --specfile $(SPECFILE) --qf '%{RELEASE}\n' | head -n 1)
+
+UPLOAD_SLICE=princeton_planetstack
+
+PWD = $(shell pwd)
+
+dist rpm: $(NAME)-$(VERSION)-$(RELEASE).rpm
+
+$(NAME)-$(VERSION).tar.gz:
+       mkdir -p $(NAME)-$(VERSION)
+       rsync -av --exclude=.svn --exclude=.git --exclude=*.tar.gz --exclude=*.rpm --exclude=__history --exclude=$(NAME)-$(VERSION)/ ./ $(NAME)-$(VERSION)
+       tar -czf $@ $(NAME)-$(VERSION)
+       rm -fr $(NAME)-$(VERSION)
+
+$(NAME)-$(VERSION)-$(RELEASE).rpm: $(NAME)-$(VERSION).tar.gz
+       mkdir -p build
+       rpmbuild -bb --define '_sourcedir $(PWD)' \
+                --define '_builddir $(PWD)/build' \
+                --define '_srcrpmdir $(PWD)' \
+                --define '_rpmdir $(PWD)' \
+                --define '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm' \
+                $(SPECFILE)
+
+srpm: $(NAME)-$(VERSION)-$(RELEASE).src.rpm
+$(NAME)-$(VERSION)-$(RELEASE).src.rpm: $(NAME)-$(VERSION).tar.gz
+       rpmbuild -bs --define "_sourcedir $$(pwd)" \
+                --define "_srcrpmdir $$(pwd)" \
+                $(SPECFILE)
+
+clean:
+       rm -f $(NAME)-$(VERSION).tar.gz $(NAME)-$(VERSION)-$(RELEASE).src.rpm $(NAME)-$(VERSION)-$(RELEASE).noarch.rpm
+       rm -rf build
+
+install: $(NAME)-$(VERSION)-$(RELEASE).rpm
+ifndef UPLOAD_HOST
+       $(error please specify UPLOAD_HOST=<hostname> on make command line)
+endif
+       scp $(NAME)-$(VERSION)-$(RELEASE).x86_64.rpm $(UPLOAD_SLICE)@$(UPLOAD_HOST):/root/
+       ssh $(UPLOAD_SLICE)@$(UPLOAD_HOST) yum -y install gcc graphviz-devel graphviz-python postgresql postgresql-server python-pip python-psycopg2 libxslt-devel python-httplib2 GeoIP
+       ssh $(UPLOAD_SLICE)@$(UPLOAD_HOST) rpm --install --upgrade --replacefiles --replacepkgs /root/$(NAME)-$(VERSION)-$(RELEASE).x86_64.rpm   
+       scp /opt/planetstack/hpc_wizard/bigquery_credentials.dat /opt/planetstack/hpc_wizard/client_secrets.json $(UPLOAD_SLICE)@$(UPLOAD_HOST):/opt/planetstack/hpc_wizard/ 
+
+install-keys:
+ifndef UPLOAD_HOST
+       $(error please specify UPLOAD_HOST=<hostname> on make command line)
+endif
+       scp /opt/planetstack/hpc_wizard/bigquery_credentials.dat /opt/planetstack/hpc_wizard/client_secrets.json $(UPLOAD_SLICE)@$(UPLOAD_HOST):/opt/planetstack/hpc_wizard/
+
+.PHONY: dist
+
diff --git a/opencloud.spec b/opencloud.spec
new file mode 100644 (file)
index 0000000..e877ff4
--- /dev/null
@@ -0,0 +1,105 @@
+Summary: OpenCloud core services
+Name: opencloud
+Version: 1.0.10
+Release: 4
+License: GPL+
+Group: Development/Tools
+Source0: %{_tmppath}/%{name}-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}
+requires: postgresql
+requires: postgresql-server
+requires: python-psycopg2
+requires: graphviz
+requires: graphviz-devel
+requires: graphviz-python
+requires: libxslt-devel
+requires: python-pip
+requires: tar
+requires: gcc
+requires: python-httplib2
+requires: GeoIP
+
+%description
+%{summary}
+
+%prep
+%setup -q
+
+%build
+# Empty section.
+
+%pre
+pip-python install django==1.5
+pip-python install djangorestframework
+pip-python install markdown  # Markdown support for the browseable API.
+pip-python install pyyaml    # YAML content-type support.
+pip-python install django-filter  # Filtering support
+pip-python install lxml  # XML manipulation library
+pip-python install netaddr # IP Addr library
+pip-python install pytz
+pip-python install django-timezones
+pip-python install requests
+pip-python install django-crispy-forms
+pip-python install django-geoposition
+pip-python install django-extensions
+pip-python install django-suit
+pip-python install django-evolution
+pip-python install django-bitfield
+pip-python install django-ipware
+
+easy_install django_evolution
+easy_install python_gflags
+easy_install google_api_python_client
+
+wget -P /usr/lib/python2.7/site-packages/suit/static/suit/js http://code.jquery.com/jquery-1.9.1.min.js
+
+if [ ! -f /usr/share/GeoIP/GeoLiteCity.dat ]; then
+   rm -f /usr/share/GeoIP/GeoLiteCity.*
+   wget -P /usr/share/GeoIP http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
+   gzip -d /usr/share/GeoIP/GeoLiteCity*.gz
+fi
+
+if [ "$1" == 2 ] ; then
+    echo "UPGRADE - saving current state"
+    /opt/planetstack/scripts/opencloud dumpdata
+fi
+
+%install
+rm -rf %{buildroot}
+mkdir -p  %{buildroot}
+install -d %{buildroot}/opt/planetstack
+
+# in builddir
+cp -rp ./planetstack %{buildroot}/opt/.
+
+find %{buildroot}/opt/planetstack -type f -print | sed "s@^$RPM_BUILD_ROOT@@g" > %{_tmppath}/tmp-filelist
+cp %{_tmppath}/tmp-filelist /tmp/tmp-filelist
+
+%clean
+rm -rf %{buildroot}
+
+%files -f %{_tmppath}/tmp-filelist
+%defattr(-,root,root,-)
+%config /opt/planetstack/plstackapi_config
+
+%post
+if [ "$1" == 1 ] ; then
+    echo "NEW INSTALL - initializing database"
+    /opt/planetstack/scripts/opencloud initdb
+else
+    echo "UPGRADE - doing evolution"
+    /opt/planetstack/scripts/opencloud evolvedb
+fi
+# start the server
+/opt/planetstack/scripts/opencloud runserver
+
+%preun
+if [ "$1" = 0 ] ; then
+    echo "UNINSTALL - destroying planetstack"
+    rm -rf /opt/planetstack
+fi
+
+%changelog
+* Sat Feb 22 2014  Siobhan Tully  1.0.0
+- First Build
+
index 690bb13..de05fe6 100644 (file)
@@ -59,9 +59,39 @@ serializerLookUp = {
 class {{ object.camel }}List(generics.ListCreateAPIView):
     queryset = {{ object.camel }}.objects.select_related.all()
     serializer_class = {{ object.camel }}Serializer
+    
+    def get_queryset(self):
+        return {{ object.camel }}.select_by_user(self.request.user)
+
+    def create(self, request, *args, **kwargs):
+        #obj = {{ object.camel }}().update(request.DATA)
+        obj = self.get_object()
+        obj.caller = request.user
+        if obj.can_update(request.user):
+            return super({{ object.camel }}List, self).create(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class {{ object.camel }}Detail(generics.RetrieveUpdateDestroyAPIView):
     queryset = {{ object.camel }}.objects.select_related.all()
     serializer_class = {{ object.camel }}Serializer
+    
+    def get_queryset(self):
+        return {{ object.camel }}.select_by_user(self.request.user)
+
+    def update(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super({{ object.camel }}Detail, self).update(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+
+    def destroy(self, request, *args, **kwargs):
+        obj = self.get_object()
+        if obj.can_update(request.user):
+            return super({{ object.camel }}Detail, self).destroy(request, *args, **kwargs)
+        else:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
+     
 
 {% endfor %}
diff --git a/planetstack/cassandra/__init__.py b/planetstack/cassandra/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/planetstack/cassandra/admin.py b/planetstack/cassandra/admin.py
new file mode 100644 (file)
index 0000000..e736815
--- /dev/null
@@ -0,0 +1,32 @@
+from django.contrib import admin
+
+from cassandra.models import *
+from django import forms
+from django.utils.safestring import mark_safe
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.contrib.auth.forms import ReadOnlyPasswordHashField
+from django.contrib.auth.signals import user_logged_in
+from django.utils import timezone
+from django.contrib.contenttypes import generic
+from suit.widgets import LinkedSelect
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline, SliceROInline,ServiceAttrAsTabROInline, ReadOnlyAwareAdmin
+
+class CassandraServiceAdmin(SingletonAdmin):
+    model = CassandraService
+    verbose_name = "Cassandra Service"
+    verbose_name_plural = "Cassandra Service"
+    list_display = ("name","enabled")
+    fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description','clusterSize','replicationFactor'], 'classes':['suit-tab suit-tab-general']})]
+    inlines = [SliceInline,ServiceAttrAsTabInline]
+
+    user_readonly_inlines = [SliceROInline, ServiceAttrAsTabROInline]
+    user_readonly_fields = ["name", "enabled", "versionNumber", "description", "clusterSize", "replicationFactor"]
+
+    suit_form_tabs =(('general', 'Cassandra Service Details'),
+        ('slices','Slices'),
+        ('serviceattrs','Additional Attributes'),
+    )
+
+admin.site.register(CassandraService, CassandraServiceAdmin)
+
diff --git a/planetstack/cassandra/models.py b/planetstack/cassandra/models.py
new file mode 100644 (file)
index 0000000..12479b3
--- /dev/null
@@ -0,0 +1,17 @@
+from core.models import User,Site,Service,SingletonModel,PlCoreBase, Slice
+import os
+from django.db import models
+from django.forms.models import model_to_dict
+
+# Create your models here.
+
+class CassandraService(SingletonModel,Service):
+    class Meta:
+        app_label = "cassandra"
+        verbose_name = "Cassandra Service"
+
+    clusterSize = models.PositiveIntegerField(default=1)
+    replicationFactor = models.PositiveIntegerField(default=1)
+
+    def __unicode__(self):  return u'Cassandra Service'
+
diff --git a/planetstack/core/acl.py b/planetstack/core/acl.py
new file mode 100644 (file)
index 0000000..7856414
--- /dev/null
@@ -0,0 +1,135 @@
+from fnmatch import fnmatch
+
+"""
+    A General-purpose ACL mechanism.
+
+    [allow | deny] <type_of_object> <text_pattern>\r
+\r
+    "allow all" and "deny all" are shorthand for allowing or denying all objects.\r
+    Lines are executed from top to bottom until a match was found, typical\r
+    iptables style. An implicit 'deny all' exists at the bottom of the list.\r
+\r
+    For example,\r
+    allow site Max Planck Institute\r
+    deny site Arizona\r
+    allow region US\r
+    deny user scott@onlab.us\r
+    allow user *@onlab.us
+"""
+
+class AccessControlList:
+    def __init__(self, aclText=None):
+        self.rules = []
+        if aclText:
+            self.import_text(aclText)
+
+    def import_text(self, aclText):
+        # allow either newline or ';' to separate rules
+        aclText = aclText.replace("\n", ";")
+        for line in aclText.split(";"):
+            line = line.strip()
+            if line.startswith("#"):
+                continue
+
+            if line=="":
+                continue
+
+            parts = line.split()
+
+            if len(parts)==2 and (parts[1]=="all"):
+                # "allow all" has no pattern
+                parts = (parts[0], parts[1], "")
+
+            if len(parts)!=3:
+                raise ACLValidationError(line)
+
+            (action, object, pattern) = parts
+
+            if action not in ["allow", "deny"]:
+                raise ACLValidationError(line)
+
+            if object not in ["site", "user", "all"]:
+                raise ACLValidationError(line)
+
+            self.rules.append( (action, object, pattern) )
+
+    def __str__(self):
+        lines = []
+        for rule in self.rules:
+            lines.append( " ".join(rule) )
+        return ";\n".join(lines)
+
+    def test(self, user, site=None):
+        for rule in self.rules:
+            if self.match_rule(rule, user):
+                return rule[0]
+        return "deny"
+
+    def match_rule(self, rule, user, site=None):
+        (action, object, pattern) = rule
+
+        if (site==None):
+            site = user.site
+
+        if (object == "site"):
+            if fnmatch(site.name, pattern):
+                return True
+        elif (object == "user"):
+            if fnmatch(user.email, pattern):
+                return True
+        elif (object == "all"):
+            return True
+
+        return False
+
+
+if __name__ == '__main__':
+    # self-test
+
+    class fakesite:
+        def __init__(self, siteName):
+            self.name = siteName
+
+    class fakeuser:
+        def __init__(self, email, siteName):
+            self.email = email
+            self.site = fakesite(siteName)
+
+    u_scott = fakeuser("scott@onlab.us", "ON.Lab")
+    u_bill = fakeuser("bill@onlab.us", "ON.Lab")
+    u_andy = fakeuser("acb@cs.princeton.edu", "Princeton")
+    u_john = fakeuser("jhh@cs.arizona.edu", "Arizona")
+    u_hacker = fakeuser("somehacker@foo.com", "Not A Real Site")
+
+    # check the "deny all" rule
+    acl = AccessControlList("deny all")
+    assert(acl.test(u_scott) == "deny")
+
+    # a blank ACL results in "deny all"
+    acl = AccessControlList("")
+    assert(acl.test(u_scott) == "deny")
+
+    # check the "allow all" rule
+    acl = AccessControlList("allow all")
+    assert(acl.test(u_scott) == "allow")
+
+    # allow only one site
+    acl = AccessControlList("allow site ON.Lab")
+    assert(acl.test(u_scott) == "allow")
+    assert(acl.test(u_andy) == "deny")
+
+    # some complicated ACL
+    acl = AccessControlList("""allow site Princeton
+                 allow user *@cs.arizona.edu
+                 deny site Arizona
+                 deny user scott@onlab.us
+                 allow site ON.Lab""")
+
+    assert(acl.test(u_scott) == "deny")
+    assert(acl.test(u_bill) == "allow")
+    assert(acl.test(u_andy) == "allow")
+    assert(acl.test(u_john) == "allow")
+    assert(acl.test(u_hacker) == "deny")
+
+    print acl
+
index 5281bb1..0e38d43 100644 (file)
@@ -43,10 +43,21 @@ class ReadOnlyAwareAdmin(admin.ModelAdmin):
         return actions
 
     def change_view(self,request,object_id, extra_context=None):
-
         if self.__user_is_readonly(request):
-            self.readonly_fields=self.user_readonly_fields
-            self.inlines = self.user_readonly_inlines
+            if not hasattr(self, "readonly_save"):\r
+                # save the original readonly fields\r
+                self.readonly_save = self.readonly_fields\r
+                self.inlines_save = self.inlines\r
+            if hasattr(self, "user_readonly_fields"):\r
+                self.readonly_fields=self.user_readonly_fields\r
+            if hasattr(self, "user_readonly_inlines"):\r
+                self.inlines = self.user_readonly_inlines\r
+        else:\r
+            if hasattr(self, "readonly_save"):\r
+                # restore the original readonly fields\r
+                self.readonly_fields = self.readonly_save\r
+            if hasattr(self, "inlines_save"):\r
+                self.inlines = self.inlines_save
 
         try:
             return super(ReadOnlyAwareAdmin, self).change_view(request, object_id, extra_context=extra_context)
@@ -57,12 +68,14 @@ class ReadOnlyAwareAdmin(admin.ModelAdmin):
         request.readonly = True
         return super(ReadOnlyAwareAdmin, self).change_view(request, object_id, extra_context=extra_context)
 
-
     def __user_is_readonly(self, request):
         return request.user.isReadOnlyUser()
 
-class SingletonAdmin (admin.ModelAdmin):
+class SingletonAdmin (ReadOnlyAwareAdmin):
     def has_add_permission(self, request):
+        if not super(SingletonAdmin, self).has_add_permission(request):
+            return False
+
         num_objects = self.model.objects.count()
         if num_objects >= 1:
             return False
@@ -156,6 +169,9 @@ class ReservationInline(PlStackTabularInline):
     model = Reservation
     extra = 0
     suit_classes = 'suit-tab suit-tab-reservations'
+        
+    def queryset(self, request):
+        return Reservation.select_by_user(request.user)
 
 class TagROInline(generic.GenericTabularInline):
     model = Tag
@@ -175,6 +191,10 @@ class TagInline(generic.GenericTabularInline):
     model = Tag
     extra = 0
     suit_classes = 'suit-tab suit-tab-tags'
+    fields = ['service', 'name', 'value']
+
+    def queryset(self, request):
+        return Tag.select_by_user(request.user)
 
 class NetworkLookerUpper:
     """ This is a callable that looks up a network name in a sliver and returns
@@ -198,16 +218,27 @@ class NetworkLookerUpper:
 
 class SliverROInline(ReadOnlyTabularInline):
     model = Sliver
-    fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
+    fields = ['ip', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node']
     suit_classes = 'suit-tab suit-tab-slivers'
 
 class SliverInline(PlStackTabularInline):
     model = Sliver
-    fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
+    fields = ['ip', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node']
     extra = 0
     readonly_fields = ['ip', 'instance_name']
     suit_classes = 'suit-tab suit-tab-slivers'
 
+    def queryset(self, request):
+        return Sliver.select_by_user(request.user)
+
+    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
+        if db_field.name == 'deploymentNetwork':
+           kwargs['queryset'] = Deployment.select_by_acl(request.user)
+
+        field = super(SliverInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
+
+        return field
+
 # Note this is breaking in the admin.py when trying to use an inline to add a node/image 
 #    def _declared_fieldsets(self):
 #        # Return None so django will call get_fieldsets and we can insert our
@@ -252,6 +283,9 @@ class SiteInline(PlStackTabularInline):
     extra = 0
     suit_classes = 'suit-tab suit-tab-sites'
 
+    def queryset(self, request):
+        return Site.select_by_user(request.user)
+
 class UserROInline(ReadOnlyTabularInline):
     model = User
     fields = ['email', 'firstname', 'lastname']
@@ -264,6 +298,9 @@ class UserInline(PlStackTabularInline):
     extra = 0
     suit_classes = 'suit-tab suit-tab-users'
 
+    def queryset(self, request):
+        return User.select_by_user(request.user)
+
 class SliceROInline(ReadOnlyTabularInline):
     model = Slice
     suit_classes = 'suit-tab suit-tab-slices'
@@ -275,27 +312,35 @@ class SliceInline(PlStackTabularInline):
     extra = 0
     suit_classes = 'suit-tab suit-tab-slices'
 
+    def queryset(self, request):
+        return Slice.select_by_user(request.user)
+
 class NodeROInline(ReadOnlyTabularInline):
     model = Node
     extra = 0
     suit_classes = 'suit-tab suit-tab-nodes'
-    fields = ['name','deployment']
+    fields = ['name','deployment','site']
 
 class NodeInline(PlStackTabularInline):
     model = Node
     extra = 0
     suit_classes = 'suit-tab suit-tab-nodes'
+    fields = ['name','deployment','site']
 
 class DeploymentPrivilegeROInline(ReadOnlyTabularInline):
     model = DeploymentPrivilege
     extra = 0
     suit_classes = 'suit-tab suit-tab-deploymentprivileges'
-    fields = ['user','role']
+    fields = ['user','role','deployment']
 
 class DeploymentPrivilegeInline(PlStackTabularInline):
     model = DeploymentPrivilege
     extra = 0
     suit_classes = 'suit-tab suit-tab-deploymentprivileges'
+    fields = ['user','role','deployment']
+
+    def queryset(self, request):
+        return DeploymentPrivilege.select_by_user(request.user)
 
 #CLEANUP DOUBLE SitePrivilegeInline
 class SitePrivilegeROInline(ReadOnlyTabularInline):
@@ -308,34 +353,44 @@ class SitePrivilegeInline(PlStackTabularInline):
     model = SitePrivilege
     extra = 0
     suit_classes = 'suit-tab suit-tab-siteprivileges'
+    fields = ['user','site', 'role']
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'site':
-            if not request.user.is_admin:
-                # only show sites where user is an admin or pi
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
-                sites = Site.objects.filter(login_base__in=login_bases)
-                kwargs['queryset'] = sites
+            kwargs['queryset'] = Site.select_by_user(request.user)
 
         if db_field.name == 'user':
-            if not request.user.is_admin:
-                # only show users from sites where caller has admin or pi role
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                sites = [site_privilege.site for site_privilege in site_privileges]
-                site_privileges = SitePrivilege.objects.filter(site__in=sites)
-                emails = [site_privilege.user.email for site_privilege in site_privileges]
-                users = User.objects.filter(email__in=emails)
-                kwargs['queryset'] = users
+            kwargs['queryset'] = User.select_by_user(request.user)
         return super(SitePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
-class SitePrivilegeInline(PlStackTabularInline):
-    model = SitePrivilege
-    suit_classes = 'suit-tab suit-tab-siteprivileges'
+    def queryset(self, request):
+        return SitePrivilege.select_by_user(request.user)
+
+class SiteDeploymentROInline(ReadOnlyTabularInline):
+    model = SiteDeployments
+    #model = Site.deployments.through
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-deployments'
+    fields = ['deployment','site']
+
+class SiteDeploymentInline(PlStackTabularInline):
+    model = SiteDeployments
+    #model = Site.deployments.through
     extra = 0
-    fields = ('user', 'site','role')
+    suit_classes = 'suit-tab suit-tab-deployments'
+    fields = ['deployment','site']
+
+    def formfield_for_foreignkey(self, db_field, request, **kwargs):
+        if db_field.name == 'site':
+            kwargs['queryset'] = Site.select_by_user(request.user)
+
+        if db_field.name == 'deployment':
+            kwargs['queryset'] = Deployment.select_by_user(request.user)
+        return super(SiteDeploymentInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
+
+    def queryset(self, request):
+        return SiteDeployments.select_by_user(request.user)
+
 
 class SlicePrivilegeROInline(ReadOnlyTabularInline):
     model = SlicePrivilege
@@ -351,26 +406,15 @@ class SlicePrivilegeInline(PlStackTabularInline):
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'slice':
-            if not request.user.is_admin:
-                # only show slices at sites where caller has admin or pi role
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                sites = [site_privilege.site for site_privilege in site_privileges]
-                slices = Slice.objects.filter(site__in=sites)
-                kwargs['queryset'] = slices 
+           kwargs['queryset'] = Slice.select_by_user(request.user) 
         if db_field.name == 'user':
-            if not request.user.is_admin:
-                # only show users from sites where caller has admin or pi role
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                sites = [site_privilege.site for site_privilege in site_privileges]
-                site_privileges = SitePrivilege.objects.filter(site__in=sites)
-                emails = [site_privilege.user.email for site_privilege in site_privileges]   
-                users = User.objects.filter(email__in=emails) 
-                kwargs['queryset'] = list(users)
+           kwargs['queryset'] = User.select_by_user(request.user) 
 
         return super(SlicePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
+    def queryset(self, request):
+        return SlicePrivilege.select_by_user(request.user)
+
 class SliceNetworkROInline(ReadOnlyTabularInline):
     model = Network.slices.through
     extra = 0
@@ -386,6 +430,16 @@ class SliceNetworkInline(PlStackTabularInline):
     verbose_name = "Network Connection"
     verbose_name_plural = "Network Connections"
     suit_classes = 'suit-tab suit-tab-slicenetworks'
+    fields = ['network']
+
+class ImageDeploymentsInline(PlStackTabularInline):
+    model = ImageDeployments
+    extra = 0
+    verbose_name = "Image Deployments"
+    verbose_name_plural = "Image Deployments"
+    suit_classes = 'suit-tab suit-tab-imagedeployments'
+    fields = ['deployment', 'glance_image_id']
+    readonly_fields = ['deployment', 'glance_image_id']
 
 class PlainTextWidget(forms.HiddenInput):
     input_type = 'hidden'
@@ -397,6 +451,20 @@ class PlainTextWidget(forms.HiddenInput):
 
 class PlanetStackBaseAdmin(ReadOnlyAwareAdmin):
     save_on_top = False
+    
+    def save_model(self, request, obj, form, change):
+        obj.caller = request.user
+        # update openstack connection to use this site/tenant
+        obj.save_by_user(request.user)
+
+    def delete_model(self, request, obj):
+        obj.delete_by_user(request.user)
+
+    def save_formset(self, request, form, formset, change):
+        instances = formset.save(commit=False)
+        for instance in instances:
+            instance.save_by_user(request.user)
+        formset.save_m2m()
 
 class SliceRoleAdmin(PlanetStackBaseAdmin):
     model = SliceRole
@@ -410,6 +478,7 @@ class DeploymentAdminForm(forms.ModelForm):
     sites = forms.ModelMultipleChoiceField(
         queryset=Site.objects.all(),
         required=False,
+        help_text="Select which sites are allowed to host nodes in this deployment",
         widget=FilteredSelectMultiple(
             verbose_name=('Sites'), is_stacked=False
         )
@@ -418,10 +487,13 @@ class DeploymentAdminForm(forms.ModelForm):
         model = Deployment
 
     def __init__(self, *args, **kwargs):
+      request = kwargs.pop('request', None)
       super(DeploymentAdminForm, self).__init__(*args, **kwargs)
 
+      self.fields['accessControl'].initial = "allow site " + request.user.site.name
+
       if self.instance and self.instance.pk:
-        self.fields['sites'].initial = self.instance.sites.all()
+        self.fields['sites'].initial = [x.site for x in self.instance.sitedeployments_set.all()]
 
     def save(self, commit=True):
       deployment = super(DeploymentAdminForm, self).save(commit=False)
@@ -430,20 +502,42 @@ class DeploymentAdminForm(forms.ModelForm):
         deployment.save()
 
       if deployment.pk:
-        deployment.sites = self.cleaned_data['sites']
+        # save_m2m() doesn't seem to work with 'through' relations. So we
+        #    create/destroy the through models ourselves. There has to be
+        #    a better way...
+
+        sites = self.cleaned_data['sites']
+
+        existing_sites = []
+        for sdp in list(deployment.sitedeployments_set.all()):
+            if sdp.site not in sites:
+                #print "deleting site", sdp.site
+                sdp.delete()
+            else:
+                existing_sites.append(sdp.site)
+
+        for site in sites:
+            if site not in existing_sites:
+                #print "adding site", site
+                sdp = SiteDeployments(site=site, deployment=deployment)
+                sdp.save()
+
         self.save_m2m()
 
       return deployment
 
+class DeploymentAdminROForm(DeploymentAdminForm):
+    def save(self, commit=True):
+        raise PermissionDenied
+
 class SiteAssocInline(PlStackTabularInline):
     model = Site.deployments.through
     extra = 0
     suit_classes = 'suit-tab suit-tab-sites'
 
 class DeploymentAdmin(PlanetStackBaseAdmin):
-    form = DeploymentAdminForm
     model = Deployment
-    fieldList = ['name','sites']
+    fieldList = ['name','sites', 'accessControl']
     fieldsets = [(None, {'fields': fieldList, 'classes':['suit-tab suit-tab-sites']})]
     inlines = [DeploymentPrivilegeInline,NodeInline,TagInline]
 
@@ -452,6 +546,22 @@ class DeploymentAdmin(PlanetStackBaseAdmin):
 
     suit_form_tabs =(('sites','Deployment Details'),('nodes','Nodes'),('deploymentprivileges','Privileges'),('tags','Tags'))
 
+    def get_form(self, request, obj=None, **kwargs):
+        if request.user.isReadOnlyUser():
+            kwargs["form"] = DeploymentAdminROForm
+        else:
+            kwargs["form"] = DeploymentAdminForm
+        adminForm = super(DeploymentAdmin,self).get_form(request, obj, **kwargs)
+
+        # from stackexchange: pass the request object into the form
+
+        class AdminFormMetaClass(adminForm):
+           def __new__(cls, *args, **kwargs):
+               kwargs['request'] = request
+               return adminForm(*args, **kwargs)
+
+        return AdminFormMetaClass
+
 class ServiceAttrAsTabROInline(ReadOnlyTabularInline):
     model = ServiceAttribute
     fields = ['name','value']
@@ -482,7 +592,7 @@ class SiteAdmin(PlanetStackBaseAdmin):
     fieldList = ['name', 'site_url', 'enabled', 'is_public', 'login_base', 'accountLink','location']
     fieldsets = [
         (None, {'fields': fieldList, 'classes':['suit-tab suit-tab-general']}),
-        ('Deployment Networks', {'fields': ['deployments'], 'classes':['suit-tab suit-tab-deployments']}),
+        #('Deployment Networks', {'fields': ['deployments'], 'classes':['suit-tab suit-tab-deployments']}),
     ]
     suit_form_tabs =(('general', 'Site Details'),
         ('users','Users'),
@@ -495,23 +605,15 @@ class SiteAdmin(PlanetStackBaseAdmin):
     readonly_fields = ['accountLink']
 
     user_readonly_fields = ['name', 'deployments','site_url', 'enabled', 'is_public', 'login_base', 'accountLink']
-    user_readonly_inlines = [SliceROInline,UserROInline,TagROInline, NodeROInline, SitePrivilegeROInline]
+    user_readonly_inlines = [SliceROInline,UserROInline,TagROInline, NodeROInline, SitePrivilegeROInline,SiteDeploymentROInline]
 
     list_display = ('name', 'login_base','site_url', 'enabled')
     filter_horizontal = ('deployments',)
-    inlines = [SliceInline,UserInline,TagInline, NodeInline, SitePrivilegeInline]
+    inlines = [SliceInline,UserInline,TagInline, NodeInline, SitePrivilegeInline, SiteDeploymentInline]
     search_fields = ['name']
 
     def queryset(self, request):
-        # admins can see all keys. Users can only see sites they belong to.
-        qs = super(SiteAdmin, self).queryset(request)
-        if not request.user.is_admin:
-            valid_sites = [request.user.site.login_base]
-            roles = request.user.get_roles()
-            for tenant_list in roles.values():
-                valid_sites.extend(tenant_list)
-            qs = qs.filter(login_base__in=valid_sites)
-        return qs
+        return Site.select_by_user(request.user)
 
     def get_formsets(self, request, obj=None):
         for inline in self.get_inline_instances(request, obj):
@@ -542,6 +644,13 @@ class SiteAdmin(PlanetStackBaseAdmin):
     accountLink.allow_tags = True
     accountLink.short_description = "Billing"
 
+    def save_model(self, request, obj, form, change):
+        # update openstack connection to use this site/tenant
+        obj.save_by_user(request.user) 
+
+    def delete_model(self, request, obj):
+        obj.delete_by_user(request.user)
+        
 
 class SitePrivilegeAdmin(PlanetStackBaseAdmin):
     fieldList = ['user', 'site', 'role']
@@ -579,12 +688,12 @@ class SitePrivilegeAdmin(PlanetStackBaseAdmin):
         # admins can see all privileges. Users can only see privileges at sites
         # where they have the admin role or pi role.
         qs = super(SitePrivilegeAdmin, self).queryset(request)
-        if not request.user.is_admin:
-            roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-            site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-            login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
-            sites = Site.objects.filter(login_base__in=login_bases)
-            qs = qs.filter(site__in=sites)
+        #if not request.user.is_admin:
+        #    roles = Role.objects.filter(role_type__in=['admin', 'pi'])
+        #    site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
+        #    login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
+        #    sites = Site.objects.filter(login_base__in=login_bases)
+        #    qs = qs.filter(site__in=sites)
         return qs
 
 class SliceForm(forms.ModelForm):
@@ -596,9 +705,9 @@ class SliceForm(forms.ModelForm):
 
 class SliceAdmin(PlanetStackBaseAdmin):
     form = SliceForm
-    fieldList = ['name', 'site', 'serviceClass', 'enabled','description', 'service', 'slice_url']
+    fieldList = ['name', 'site', 'serviceClass', 'enabled','description', 'service', 'slice_url', 'max_slivers']
     fieldsets = [('Slice Details', {'fields': fieldList, 'classes':['suit-tab suit-tab-general']}),]
-    list_display = ('name', 'site','serviceClass', 'slice_url')
+    list_display = ('name', 'site','serviceClass', 'slice_url', 'max_slivers')
     inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline,SliceNetworkInline]
 
     user_readonly_fields = fieldList
@@ -614,26 +723,13 @@ class SliceAdmin(PlanetStackBaseAdmin):
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'site':
-            if not request.user.is_admin:
-                # only show sites where user is a pi or admin 
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
-                sites = Site.objects.filter(login_base__in=login_bases)
-                kwargs['queryset'] = sites
-
+            kwargs['queryset'] = Site.select_by_user(request.user)
+                
         return super(SliceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     def queryset(self, request):
         # admins can see all keys. Users can only see slices they belong to.
-        qs = super(SliceAdmin, self).queryset(request)
-        if not request.user.is_admin:
-            valid_slices = []
-            roles = request.user.get_roles()
-            for tenant_list in roles.values():
-                valid_slices.extend(tenant_list)
-            qs = qs.filter(name__in=valid_slices)
-        return qs
+        return Slice.select_by_user(request.user)
 
     def get_formsets(self, request, obj=None):
         for inline in self.get_inline_instances(request, obj):
@@ -644,12 +740,6 @@ class SliceAdmin(PlanetStackBaseAdmin):
                 inline.model.caller = request.user
             yield inline.get_formset(request, obj)
 
-    def get_queryset(self, request):
-        qs = super(SliceAdmin, self).get_queryset(request)
-        if request.user.is_superuser:
-            return qs
-        # users can only see slices at their site
-        return qs.filter(site=request.user.site)
 
 class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
     fieldsets = [
@@ -662,39 +752,17 @@ class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'slice':
-            if not request.user.is_admin:
-                # only show slices at sites where caller has admin or pi role
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                sites = [site_privilege.site for site_privilege in site_privileges]
-                slices = Slice.objects.filter(site__in=sites)
-                kwargs['queryset'] = slices
+            kwargs['queryset'] = Slice.select_by_user(request.user)
         
         if db_field.name == 'user':
-            if not request.user.is_admin:
-                # only show users from sites where caller has admin or pi role
-                roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-                site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-                sites = [site_privilege.site for site_privilege in site_privileges]
-                site_privileges = SitePrivilege.objects.filter(site__in=sites)
-                emails = [site_privilege.user.email for site_privilege in site_privileges]
-                users = User.objects.filter(email__in=emails)
-                kwargs['queryset'] = users
+            kwargs['queryset'] = User.select_by_user(request.user)
 
         return super(SlicePrivilegeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     def queryset(self, request):
         # admins can see all memberships. Users can only see memberships of
         # slices where they have the admin role.
-        qs = super(SlicePrivilegeAdmin, self).queryset(request)
-        if not request.user.is_admin:
-            roles = Role.objects.filter(role_type__in=['admin', 'pi'])
-            site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
-            login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
-            sites = Site.objects.filter(login_base__in=login_bases)
-            slices = Slice.objects.filter(site__in=sites)
-            qs = qs.filter(slice__in=slices)
-        return qs
+        return SlicePrivilege.select_by_user(request.user)
 
     def save_model(self, request, obj, form, change):
         # update openstack connection to use this site/tenant
@@ -714,15 +782,15 @@ class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
 class ImageAdmin(PlanetStackBaseAdmin):
 
     fieldsets = [('Image Details', 
-                   {'fields': ['image_id', 'name', 'disk_format', 'container_format'], 
+                   {'fields': ['name', 'disk_format', 'container_format'], 
                     'classes': ['suit-tab suit-tab-general']})
                ]
 
-    suit_form_tabs =(('general','Image Details'),('slivers','Slivers'))
+    suit_form_tabs =(('general','Image Details'),('slivers','Slivers'),('imagedeployments','Deployments'))
 
-    inlines = [SliverInline]
+    inlines = [SliverInline, ImageDeploymentsInline]
     
-    user_readonly_fields = ['image_id', 'name', 'disk_format', 'container_format']
+    user_readonly_fields = ['name', 'disk_format', 'container_format']
     user_readonly_inlines = [SliverROInline]
     
 class NodeForm(forms.ModelForm):
@@ -783,24 +851,15 @@ class SliverAdmin(PlanetStackBaseAdmin):
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'slice':
-            if not request.user.is_admin:
-                slices = set([sm.slice.name for sm in SlicePrivilege.objects.filter(user=request.user)]) 
-                kwargs['queryset'] = Slice.objects.filter(name__in=list(slices))
+            kwargs['queryset'] = Slice.select_by_user(request.user)
 
         return super(SliverAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     def queryset(self, request):
         # admins can see all slivers. Users can only see slivers of 
         # the slices they belong to.
-        qs = super(SliverAdmin, self).queryset(request)
-        if not request.user.is_admin:
-            tenants = []
-            roles = request.user.get_roles()
-            for tenant_list in roles.values():
-                tenants.extend(tenant_list)
-            valid_slices = Slice.objects.filter(name__in=tenants)
-            qs = qs.filter(slice__in=valid_slices)
-        return qs
+        return Sliver.select_by_user(request.user)
+
 
     def get_formsets(self, request, obj=None):
         # make some fields read only if we are updating an existing record
@@ -815,10 +874,8 @@ class SliverAdmin(PlanetStackBaseAdmin):
             # hide MyInline in the add view
             if obj is None:
                 continue
-            # give inline object access to driver and caller
-            auth = request.session.get('auth', {})
-            auth['tenant'] = obj.name       # meed to connect using slice's tenant
-            inline.model.os_manager = OpenStackManager(auth=auth, caller=request.user)
+            if isinstance(inline, SliverInline):
+                inline.model.caller = request.user
             yield inline.get_formset(request, obj)
 
     #def save_model(self, request, obj, form, change):
@@ -881,6 +938,18 @@ class UserChangeForm(forms.ModelForm):
         # field does not have access to the initial value
         return self.initial["password"]
 
+class UserDashboardViewInline(PlStackTabularInline):
+    model = UserDashboardView
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-dashboards'
+    fields = ['user', 'dashboardView', 'order']
+
+class UserDashboardViewROInline(ReadOnlyTabularInline):
+    model = UserDashboardView
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-dashboards'
+    fields = ['user', 'dashboardView', 'order']
+
 class UserAdmin(UserAdmin):
     class Meta:
         app_label = "core"
@@ -895,7 +964,7 @@ class UserAdmin(UserAdmin):
     list_display = ('email', 'firstname', 'lastname', 'site', 'last_login')
     #list_display = ('email', 'username','firstname', 'lastname', 'is_admin', 'last_login')
     list_filter = ('site',)
-    inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline]
+    inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline,UserDashboardViewInline]
 
     fieldListLoginDetails = ['email','site','password','is_readonly','is_amin','public_key']
     fieldListContactInfo = ['firstname','lastname','phone','timezone']
@@ -903,6 +972,7 @@ class UserAdmin(UserAdmin):
     fieldsets = (
         ('Login Details', {'fields': ['email', 'site','password', 'is_readonly', 'is_admin', 'public_key'], 'classes':['suit-tab suit-tab-general']}),
         ('Contact Information', {'fields': ('firstname','lastname','phone', 'timezone'), 'classes':['suit-tab suit-tab-contact']}),
+        #('Dashboard Views', {'fields': ('dashboards',), 'classes':['suit-tab suit-tab-dashboards']}),
         #('Important dates', {'fields': ('last_login',)}),
     )
     add_fieldsets = (
@@ -915,20 +985,19 @@ class UserAdmin(UserAdmin):
     ordering = ('email',)
     filter_horizontal = ()
 
-    user_readonly_fields = fieldListLoginDetails
-    user_readonly_inlines = [SlicePrivilegeROInline,SitePrivilegeROInline,DeploymentPrivilegeROInline]
+    user_readonly_fields = fieldListLoginDetails + fieldListContactInfo
+    user_readonly_inlines = [SlicePrivilegeROInline,SitePrivilegeROInline,DeploymentPrivilegeROInline,UserDashboardViewROInline]
 
-    suit_form_tabs =(('general','Login Details'),('contact','Contact Information'),('sliceprivileges','Slice Privileges'),('siteprivileges','Site Privileges'),('deploymentprivileges','Deployment Privileges'))
+    suit_form_tabs =(('general','Login Details'),
+                     ('contact','Contact Information'),
+                     ('sliceprivileges','Slice Privileges'),
+                     ('siteprivileges','Site Privileges'),
+                     ('deploymentprivileges','Deployment Privileges'),
+                     ('dashboards','Dashboard Views'))
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'site':
-            if not request.user.is_admin:
-                # show sites where caller is an admin or pi 
-                sites = []
-                for site_privilege in SitePrivilege.objects.filer(user=request.user):
-                    if site_privilege.role.role_type in ['admin', 'pi']:
-                        sites.append(site_privilege.site.login_base)  
-                kwargs['queryset'] = Site.objects.filter(login_base__in(list(sites)))
+            kwargs['queryset'] = Site.select_by_user(request.user)
 
         return super(UserAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
@@ -950,8 +1019,18 @@ class UserAdmin(UserAdmin):
     def change_view(self,request,object_id, extra_context=None):
 
         if self.__user_is_readonly(request):
+            if not hasattr(self, "readonly_save"):
+                # save the original readonly fields\r
+                self.readonly_save = self.readonly_fields\r
+                self.inlines_save = self.inlines
             self.readonly_fields=self.user_readonly_fields
             self.inlines = self.user_readonly_inlines
+        else:
+            if hasattr(self, "readonly_save"):\r
+                # restore the original readonly fields\r
+                self.readonly_fields = self.readonly_save\r
+                self.inlines = self.inlines_save
+
         try:
             return super(UserAdmin, self).change_view(request, object_id, extra_context=extra_context)
         except PermissionDenied:
@@ -966,7 +1045,16 @@ class UserAdmin(UserAdmin):
         #return "readonly" in groups
         return request.user.isReadOnlyUser()
 
+    def queryset(self, request):
+        return User.select_by_user(request.user)
+
+class DashboardViewAdmin(PlanetStackBaseAdmin):
+    fieldsets = [('Dashboard View Details',
+                   {'fields': ['name', 'url'],
+                    'classes': ['suit-tab suit-tab-general']})
+               ]
 
+    suit_form_tabs =(('general','Dashboard View Details'),)
 
 class ServiceResourceROInline(ReadOnlyTabularInline):
     model = ServiceResource
@@ -1015,6 +1103,9 @@ class ReservedResourceInline(PlStackTabularInline):
 \r
         return field
 
+    def queryset(self, request):
+        return ReservedResource.select_by_user(request.user)
+
 class ReservationChangeForm(forms.ModelForm):
     class Meta:
         model = Reservation
@@ -1124,6 +1215,9 @@ class ReservationAdmin(PlanetStackBaseAdmin):
         else:
             return []
 
+    def queryset(self, request):
+        return Reservation.select_by_user(request.user)
+
 class NetworkParameterTypeAdmin(PlanetStackBaseAdmin):
     list_display = ("name", )
     user_readonly_fields = ['name']
@@ -1382,4 +1476,5 @@ if True:
     #admin.site.register(SitePrivilege, SitePrivilegeAdmin)
     admin.site.register(Sliver, SliverAdmin)
     admin.site.register(Image, ImageAdmin)
+    admin.site.register(DashboardView, DashboardViewAdmin)
 
diff --git a/planetstack/core/context_processors.py b/planetstack/core/context_processors.py
new file mode 100644 (file)
index 0000000..270ec4e
--- /dev/null
@@ -0,0 +1,4 @@
+from django.conf import settings
+
+def planetstack(request):
+    return {"DISABLE_MINIDASHBOARD": settings.DISABLE_MINIDASHBOARD}
diff --git a/planetstack/core/dashboard/sites.py b/planetstack/core/dashboard/sites.py
new file mode 100644 (file)
index 0000000..5d670d0
--- /dev/null
@@ -0,0 +1,66 @@
+#sites.py
+
+from django.contrib.admin.sites import AdminSite
+
+
+class AdminMixin(object):
+    """Mixin for AdminSite to allow custom dashboard views."""
+
+    def __init__(self, *args, **kwargs):
+        return super(AdminMixin, self).__init__(*args, **kwargs)
+
+    def get_urls(self):
+        """Add our dashboard view to the admin urlconf. Deleted the default index."""
+        from django.conf.urls import patterns, url
+        from views import DashboardCustomize, DashboardDynamicView, DashboardWelcomeView, DashboardAjaxView, SimulatorView, \
+                          DashboardSummaryAjaxView, DashboardAddOrRemoveSliverView, DashboardUserSiteView, DashboardAnalyticsAjaxView, \
+                          TenantViewData,TenantCreateSlice, TenantAddOrRemoveSliverView, TenantPickSitesView, TenantDeleteSliceView, \
+                          TenantUpdateSlice, DashboardSliceInteractions
+
+        urls = super(AdminMixin, self).get_urls()
+        del urls[0]
+        custom_url = patterns('',
+               url(r'^$', self.admin_view(DashboardDynamicView.as_view()),
+                    name="index"),
+               url(r'^test/', self.admin_view(DashboardUserSiteView.as_view()),
+                    name="test"),
+               url(r'^sliceinteractions/(?P<name>\w+)/$', self.admin_view(DashboardSliceInteractions.as_view()),
+                    name="interactions"),
+               url(r'^dashboard/(?P<name>\w+)/$', self.admin_view(DashboardDynamicView.as_view()),
+                    name="dashboard"),
+              url(r'^customize/$', self.admin_view(DashboardCustomize.as_view()),
+                    name="customize"),
+               url(r'^hpcdashuserslices/', self.admin_view(DashboardUserSiteView.as_view()),
+                    name="hpcdashuserslices"),
+               url(r'^hpcdashboard/', self.admin_view(DashboardAjaxView.as_view()),        # DEPRECATED
+                    name="hpcdashboard"),
+               url(r'^simulator/', self.admin_view(SimulatorView.as_view()),
+                    name="simulator"),
+               url(r'^hpcsummary/', self.admin_view(DashboardSummaryAjaxView.as_view()),   # DEPRECATED
+                    name="hpcsummary"),
+               url(r'^analytics/(?P<name>\w+)/$', DashboardAnalyticsAjaxView.as_view(),
+                    name="analytics"),
+               url(r'^dashboardaddorremsliver/$', self.admin_view(DashboardAddOrRemoveSliverView.as_view()),
+                    name="addorremsliver"),
+               url(r'^tenantaddorremsliver/$', self.admin_view(TenantAddOrRemoveSliverView.as_view()),
+                    name="tenantaddorremsliver"),
+               url(r'^tenantview/$', self.admin_view(TenantViewData.as_view()),
+                    name="tenantview"),
+               url(r'^createnewslice/$', self.admin_view(TenantCreateSlice.as_view()),
+                    name="createnewslice"),
+              url(r'^updateslice/$', self.admin_view(TenantUpdateSlice.as_view()),
+                    name="updateslice"),
+               url(r'^picksites/$', self.admin_view(TenantPickSitesView.as_view()),
+                    name="picksites"),
+              url(r'^tenantdeleteslice/$', self.admin_view(TenantDeleteSliceView.as_view()),
+                    name="tenantdeleteslice")
+        )
+
+        return custom_url + urls
+
+
+class SitePlus(AdminMixin, AdminSite):
+    """
+    A Django AdminSite with the AdminMixin to allow registering custom
+    dashboard view.
+    """
diff --git a/planetstack/core/dashboard/views/__init__.py b/planetstack/core/dashboard/views/__init__.py
new file mode 100644 (file)
index 0000000..a152700
--- /dev/null
@@ -0,0 +1,9 @@
+from home import DashboardWelcomeView, DashboardDynamicView
+from tenant import TenantCreateSlice, TenantUpdateSlice, TenantDeleteSliceView, TenantAddOrRemoveSliverView, TenantPickSitesView, TenantViewData
+from simulator import SimulatorView
+from cdn import DashboardSummaryAjaxView, DashboardAddOrRemoveSliverView, DashboardAjaxView
+from analytics import DashboardAnalyticsAjaxView
+from customize import DashboardCustomize
+from interactions import DashboardSliceInteractions
+from test import DashboardUserSiteView
+
diff --git a/planetstack/core/dashboard/views/analytics.py b/planetstack/core/dashboard/views/analytics.py
new file mode 100644 (file)
index 0000000..09d1bbc
--- /dev/null
@@ -0,0 +1,9 @@
+from view_common import *
+
+class DashboardAnalyticsAjaxView(View):
+    def get(self, request, name="hello_world", **kwargs):
+        if (name == "bigquery"):
+            (mimetype, data) = DoPlanetStackAnalytics(request)
+            return HttpResponse(data, mimetype=mimetype)
+        else:
+            return HttpResponse(json.dumps("Unknown"), mimetype='application/javascript')
diff --git a/planetstack/core/dashboard/views/cdn.py b/planetstack/core/dashboard/views/cdn.py
new file mode 100644 (file)
index 0000000..63ec2f2
--- /dev/null
@@ -0,0 +1,49 @@
+from view_common import *
+
+class DashboardSummaryAjaxView(View):
+    def get(self, request, **kwargs):
+        def avg(x):
+            if len(x)==0:
+                return 0
+            return float(sum(x))/len(x)
+
+        sites = getCDNOperatorData().values()
+
+        sites = [site for site in sites if site["numHPCSlivers"]>0]
+
+        total_slivers = sum( [site["numHPCSlivers"] for site in sites] )
+        total_bandwidth = sum( [site["bandwidth"] for site in sites] )
+        average_cpu = int(avg( [site["load"] for site in sites] ))
+
+        result= {"total_slivers": total_slivers,
+                "total_bandwidth": total_bandwidth,
+                "average_cpu": average_cpu}
+
+        return HttpResponse(json.dumps(result), mimetype='application/javascript')
+
+class DashboardAddOrRemoveSliverView(View):
+    # TODO: deprecate this view in favor of using TenantAddOrRemoveSliverView
+
+    def post(self, request, *args, **kwargs):
+        siteName = request.POST.get("site", None)
+        actionToDo = request.POST.get("actionToDo", "0")
+
+        siteList = [Site.objects.get(name=siteName)]
+        slice = Slice.objects.get(name="HyperCache")
+
+        if request.user.isReadOnlyUser():
+            return HttpResponseForbidden("User is in read-only mode")
+
+        if (actionToDo == "add"):
+            user_ip = request.GET.get("ip", get_ip(request))
+            slice_increase_slivers(request.user, user_ip, siteList, slice, 1)
+        elif (actionToDo == "rem"):
+            slice_decrease_slivers(request.user, siteList, slice, 1)
+
+        print '*' * 50
+        print 'Ask for site: ' + siteName + ' to ' + actionToDo + ' another HPC Sliver'
+        return HttpResponse(json.dumps("Success"), mimetype='application/javascript')
+
+class DashboardAjaxView(View):
+    def get(self, request, **kwargs):
+        return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
diff --git a/planetstack/core/dashboard/views/customize.py b/planetstack/core/dashboard/views/customize.py
new file mode 100644 (file)
index 0000000..f081cfb
--- /dev/null
@@ -0,0 +1,22 @@
+from view_common import *
+
+class DashboardCustomize(View):
+    def post(self, request, *args, **kwargs):\r
+        if request.user.isReadOnlyUser():\r
+            return HttpResponseForbidden("User is in read-only mode")\r
+\r
+        dashboards = request.POST.get("dashboards", None)\r
+        if not dashboards:\r
+            dashboards=[]\r
+        else:\r
+            dashboards = [x.strip() for x in dashboards.split(",")]\r
+            dashboards = [DashboardView.objects.get(name=x) for x in dashboards]\r
+\r
+        request.user.dashboardViews.all().delete()\r
+\r
+        for i,dashboard in enumerate(dashboards):\r
+            udbv = UserDashboardView(user=request.user, dashboardView=dashboard, order=i)\r
+            udbv.save()\r
+\r
+        return HttpResponse(json.dumps("Success"), mimetype='application/javascript')
+
diff --git a/planetstack/core/dashboard/views/home.py b/planetstack/core/dashboard/views/home.py
new file mode 100644 (file)
index 0000000..06e2c5f
--- /dev/null
@@ -0,0 +1,92 @@
+from view_common import *
+
+class DashboardWelcomeView(TemplateView):
+    template_name = 'admin/dashboard/welcome.html'
+
+    def get(self, request, *args, **kwargs):
+        context = self.get_context_data(**kwargs)
+        context = getDashboardContext(request.user, context)
+        return self.render_to_response(context=context)
+
+class DashboardDynamicView(TemplateView):
+    head_template = r"""{% extends "admin/dashboard/dashboard_base.html" %}
+       {% load admin_static %}
+       {% block content %}
+    """
+
+    tail_template = r"{% endblock %}"
+
+    def get(self, request, name="root", *args, **kwargs):
+        context = self.get_context_data(**kwargs)
+        context = getDashboardContext(request.user, context)
+
+        if name=="root":
+            return self.multiDashboardView(request, context)
+        else:
+            return self.singleDashboardView(request, name, context)
+
+    def readDashboard(self, fn):
+        try:
+            template= open("/opt/planetstack/templates/admin/dashboard/%s.html" % fn, "r").read()
+            if (fn=="tenant"):
+                # fix for tenant view - it writes html to a div called tabs-5
+                template = '<div id="tabs-5"></div>' + template
+            return template
+        except:
+            return "failed to open %s" % fn
+
+    def multiDashboardView(self, request, context):
+        head_template = self.head_template
+        tail_template = self.tail_template
+
+        body = """
+         <div id="hometabs" >
+         <ul id="suit_form_tabs" class="nav nav-tabs nav-tabs-suit" data-tab-prefix="suit-tab">
+        """
+
+        dashboards = request.user.get_dashboards()
+
+        # customize is a special dashboard they always get
+        customize = DashboardView.objects.filter(name="Customize")
+        if customize:
+            dashboards.append(customize[0])
+
+        for i,view in enumerate(dashboards):
+            body = body + '<li><a href="#dashtab-%d">%s</a></li>\n' % (i, view.name)
+
+        body = body + "</ul>\n"
+
+        for i,view in enumerate(dashboards):
+            url = view.url
+            body = body + '<div id="dashtab-%d">\n' % i
+            if url.startswith("template:"):
+                fn = url[9:]
+                body = body + self.readDashboard(fn)
+            body = body + '</div>\n'
+
+        body=body+"</div>\n"
+
+        t = template.Template(head_template + body + self.tail_template)
+
+        response_kwargs = {}
+        response_kwargs.setdefault('content_type', self.content_type)
+        return self.response_class(\r
+            request = request,\r
+            template = t,\r
+            context = context,\r
+            **response_kwargs)
+
+    def singleDashboardView(self, request, name, context):
+        head_template = self.head_template
+        tail_template = self.tail_template
+
+        t = template.Template(head_template + self.readDashboard(name) + self.tail_template)
+
+        response_kwargs = {}
+        response_kwargs.setdefault('content_type', self.content_type)
+        return self.response_class(\r
+            request = request,\r
+            template = t,\r
+            context = context,\r
+            **response_kwargs)
+
diff --git a/planetstack/core/dashboard/views/interactions.py b/planetstack/core/dashboard/views/interactions.py
new file mode 100644 (file)
index 0000000..23d755f
--- /dev/null
@@ -0,0 +1,103 @@
+from view_common import *
+
+class DashboardSliceInteractions(View):
+    def get(self, request, name="users", **kwargs):
+        colors = ["#005586", "#6ebe49", "orange", "#707170", "#00c4b3", "#077767", "dodgerblue", "#a79b94", "#c4e76a", "red"]
+
+        groups = []
+        matrix = []
+        slices = list(Slice.objects.all())
+
+        ids_by_slice = self.build_id_list(slices, name)
+
+        slices = [x for x in slices if (len(ids_by_slice[x])>0)]
+
+        for i,slice in enumerate(slices):
+            groups.append({"name": slice.name, "color": colors[i%len(colors)]})
+            row=self.buildMatrix(slice, slices, name, ids_by_slice)
+            matrix.append(row)
+
+        result = {"groups": groups, "matrix": matrix}
+
+        if name=="users":
+            result["title"] = "Slice interactions by user privilege"
+            result["objectName"] = "users"
+        elif name=="networks":
+            result["title"] = "Slice interactions by network membership"
+            result["objectName"] = "networks"
+        elif name=="sites":
+            result["title"] = "Slice interactions by site ownership"
+            result["objectName"] = "sites"
+        elif name=="sliver_sites":
+            result["title"] = "Slice interactions by sliver sites"
+            result["objectName"] = "sites"
+        elif name=="sliver_nodes":
+            result["title"] = "Slice interactions by sliver nodes"
+            result["objectName"] = "nodes"
+
+        return HttpResponse(json.dumps(result), mimetype='application/javascript')
+
+    def build_id_list(self, slices, name):
+        ids_by_slice = {}
+        for slice in slices:
+            # build up a list of object ids that are used by each slice
+            ids_by_slice[slice] = self.getIds(slice, name)
+
+        return ids_by_slice
+
+    def buildMatrix(self, slice, slices, name, ids_by_slice):
+        not_only_my_ids = []
+
+        # build up a list of object ids that are used by other slices
+        for otherSlice in ids_by_slice.keys():
+            if (slice != otherSlice):
+                for id in ids_by_slice[otherSlice]:
+                    if not id in not_only_my_ids:
+                        not_only_my_ids.append(id)
+
+        # build up a list of ids that are used only by the slice, and not
+        # shared with any other slice
+        only_my_ids = []
+        for id in ids_by_slice[slice]:
+             if id not in not_only_my_ids:
+                  only_my_ids.append(id)
+
+        row = []
+        for otherSlice in ids_by_slice.keys():
+            if (otherSlice == slice):
+                row.append(len(only_my_ids))
+            else:
+                row.append(self.inCommonIds(ids_by_slice[slice], ids_by_slice[otherSlice]))
+
+        return row
+
+    def getIds(self, slice, name):
+        ids=[]
+        if name=="users":
+            for sp in slice.slice_privileges.all():
+                    if sp.user.id not in ids:
+                        ids.append(sp.user.id)
+        elif name=="networks":
+            for sp in slice.networkslice_set.all():
+                    if sp.network.id not in ids:
+                        ids.append(sp.network.id)
+        elif name=="sites":
+            ids = [slice.site.id]
+        elif name=="sliver_sites":
+            for sp in slice.slivers.all():
+                 if sp.node.site.id not in ids:
+                     ids.append(sp.node.site.id)
+        elif name=="sliver_nodes":
+            for sp in slice.slivers.all():
+                 if sp.node.id not in ids:
+                     ids.append(sp.node.id)
+        return ids
+
+    def inCommonIds(self, ids1, ids2):
+        count = 0
+        for id in ids1:
+            if id in ids2:
+                count+=1
+        return count
+
+
diff --git a/planetstack/core/dashboard/views/simulator.py b/planetstack/core/dashboard/views/simulator.py
new file mode 100644 (file)
index 0000000..43332ab
--- /dev/null
@@ -0,0 +1,18 @@
+from view_common import *
+
+class SimulatorView(View):
+    def get(self, request, **kwargs):
+        sim = json.loads(file("/tmp/simulator.json","r").read())
+        text = "<html><head></head><body>"
+        text += "Iteration: %d<br>" % sim["iteration"]
+        text += "Elapsed since report %d<br><br>" % sim["elapsed_since_report"]
+        text += "<table border=1>"
+        text += "<tr><th>site</th><th>trend</th><th>weight</th><th>bytes_sent</th><th>hot</th></tr>"
+        for site in sim["site_load"].values():
+            text += "<tr>"
+            text += "<td>%s</td><td>%0.2f</td><td>%0.2f</td><td>%d</td><td>%0.2f</td>" % \
+                        (site["name"], site["trend"], site["weight"], site["bytes_sent"], site["load_frac"])
+            text += "</tr>"
+        text += "</table>"
+        text += "</body></html>"
+        return HttpResponse(text)
diff --git a/planetstack/core/dashboard/views/tenant.py b/planetstack/core/dashboard/views/tenant.py
new file mode 100644 (file)
index 0000000..9066a2b
--- /dev/null
@@ -0,0 +1,339 @@
+from view_common import *
+import functools
+
+BLESSED_SITES = ["Stanford", "Washington", "Princeton", "GeorgiaTech", "MaxPlanck"]
+
+class TenantCreateSlice(View):
+    def post(self, request, *args, **kwargs):
+        if request.user.isReadOnlyUser():
+            return HttpResponseForbidden("User is in read-only mode")
+
+        sliceName = request.POST.get("sliceName", "0")
+        serviceClass = request.POST.get("serviceClass", "0")
+        imageName = request.POST.get("imageName", "0")
+        actionToDo = request.POST.get("actionToDo", "0")
+        networkPorts = request.POST.get("network","0")
+        mountDataSets = request.POST.get("mountDataSets","0")
+        privateVolume = request.POST.get("privateVolume","0")
+        if (actionToDo == "add"):
+           serviceClass = ServiceClass.objects.get(name=serviceClass)
+           site = request.user.site
+           image = Image.objects.get(name=imageName)
+           newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=image,mountDataSets=mountDataSets)
+           newSlice.save()
+          privateTemplate="Private"
+          publicTemplate="Public shared IPv4"\r
+          privateNetworkName = sliceName+"-"+privateTemplate\r
+          publicNetworkName = sliceName+"-"+publicTemplate\r
+          slice=Slice.objects.get(name=sliceName)\r
+          addNetwork(privateNetworkName,privateTemplate,slice)\r
+          addNetwork(publicNetworkName,publicTemplate,slice)\r
+          addOrModifyPorts(networkPorts,sliceName)\r
+          if privateVolume=="true":\r
+               privateVolForSlice(request.user,sliceName)
+        return HttpResponse(json.dumps("Slice created"), mimetype='application/javascript')
+
+def privateVolForSlice(user,sliceName):
+       if not hasPrivateVolume(sliceName):\r
+          volumeName=createPrivateVolume(user,sliceName)\r
+          readWrite="true"\r
+          mountVolume(sliceName,volumeName,readWrite)
+
+class TenantUpdateSlice(View):
+    def post(self, request, *args, **kwargs):\r
+        if request.user.isReadOnlyUser():\r
+            return HttpResponseForbidden("User is in read-only mode")\r
+\r
+        sliceName = request.POST.get("sliceName", "0")\r
+        serviceClass = request.POST.get("serviceClass", "0")\r
+        imageName = request.POST.get("imageName", "0")\r
+        actionToDo = request.POST.get("actionToDo", "0")\r
+        networkPorts = request.POST.get("networkPorts","0")\r
+        dataSet = request.POST.get("dataSet","0")\r
+        privateVolume = request.POST.get("privateVolume","0")\r
+        slice = Slice.objects.all()\r
+        for entry in slice:\r
+                serviceClass = ServiceClass.objects.get(name=serviceClass)\r
+                if(entry.name==sliceName):\r
+                         if (actionToDo == "update"):\r
+                                setattr(entry,'serviceClass',serviceClass)\r
+                                setattr(entry,'imagePreference',imageName)\r
+                                setattr(entry,'mountDataSets',dataSet)\r
+                                entry.save()\r
+                                break\r
+       addOrModifyPorts(networkPorts,sliceName)\r
+       if privateVolume=="true":\r
+                privateVolForSlice(request.user,sliceName)\r
+        return HttpResponse(json.dumps("Slice updated"), mimetype='application/javascript')\r
+\r
+def addNetwork(name,template,sliceName):\r
+       networkTemplate=NetworkTemplate.objects.get(name=template)\r
+       newNetwork = Network(name = name,\r
+                              template = networkTemplate,\r
+                              owner = sliceName)\r
+        newNetwork.save()\r
+       addNetworkSlice(newNetwork,sliceName)\r
+\r
+def addNetworkSlice(networkSlice,sliceName):\r
+       newNetworkSlice=NetworkSlice(network =networkSlice,\r
+                                    slice=sliceName)\r
+       newNetworkSlice.save()\r
+\r
+def addOrModifyPorts(networkPorts,sliceName):\r
+       networkList = Network.objects.all()\r
+        networkInfo = []\r
+        if networkPorts:\r
+           for networkEntry in networkList:\r
+               networkSlices = networkEntry.slices.all()\r
+               for slice in networkSlices:\r
+                   if slice.name==sliceName:\r
+                          if networkEntry.template.name=="Public shared IPv4":\r
+                             setattr(networkEntry,'ports',networkPorts)\r
+                             networkEntry.save()\r
+\r
+def getTenantSliceInfo(user, tableFormat = False):
+    tenantSliceDetails = {}
+    tenantSliceData = getTenantInfo(user)
+    tenantServiceClassData = getServiceClassInfo(user)
+    if (tableFormat):
+       tenantSliceDetails['userSliceInfo'] = userSliceTableFormatter(tenantSliceData)
+       tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
+    else:
+       tenantSliceDetails['userSliceInfo'] = tenantSliceData
+    tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
+    tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user))
+    tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites())
+    tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo())
+    tenantSliceDetails['mountDataSets'] = userSliceTableFormatter(getMountDataSets())
+    tenantSliceDetails['publicKey'] = getPublicKey(user)
+    return tenantSliceDetails
+
+def getTenantInfo(user):
+    slices =Slice.objects.all()
+    userSliceInfo = []
+    for entry in slices:
+       sliceName = Slice.objects.get(id=entry.id).name
+       slice = Slice.objects.get(name=Slice.objects.get(id=entry.id).name)
+       sliceServiceClass = entry.serviceClass.name
+       preferredImage =  entry.imagePreference
+       #sliceDataSet = entry.mountDataSets
+       sliceNetwork = {}
+       numSliver = 0
+       sliceImage=""
+       sliceSite = {}
+       sliceNode = {}
+       sliceInstance= {}
+       #createPrivateVolume(user,sliceName)
+       for sliver in slice.slivers.all():
+           if sliver.node.site.name in BLESSED_SITES:
+                sliceSite[sliver.node.site.name] = sliceSite.get(sliver.node.site.name,0) + 1
+                sliceImage = sliver.image.name
+                sliceNode[str(sliver)] = sliver.node.name
+       numSliver = sum(sliceSite.values())
+       numSites = len(sliceSite)
+       userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'instanceNodePair':sliceNode})
+    return userSliceInfo
+
+def getTenantSitesInfo():
+       tenantSiteInfo=[]
+        for entry in Site.objects.all():
+            if entry.name in BLESSED_SITES:
+                tenantSiteInfo.append({'siteName':entry.name})
+       return tenantSiteInfo
+
+def getPublicKey(user):
+       users=User.objects.all()\r
+        for key in users:\r
+               if (str(key.email)==str(user)):\r
+                       sshKey = key.public_key\r
+        return sshKey
+
+def getServiceClassInfo(user):
+    serviceClassList = ServiceClass.objects.all()
+    sliceInfo = []
+    for entry in serviceClassList:
+          sliceInfo.append({'serviceClass':entry.name})
+    return sliceInfo
+
+def getImageInfo(user):
+    imageList = Image.objects.all()
+    #imageList = ['Fedora 16 LXC rev 1.3','Hadoop','MPI']
+    imageInfo = []
+    for imageEntry in imageList:
+          imageInfo.append({'Image':imageEntry.name})
+          #imageInfo.append({'Image':imageEntry})
+    return imageInfo
+
+def createPrivateVolume(user, sliceName):
+    caps = Volume.CAP_READ_DATA | Volume.CAP_WRITE_DATA | Volume.CAP_HOST_DATA
+    getattr(Volume.default_gateway_caps,"read data") | \
+           getattr(Volume.default_gateway_caps,"write data") | \
+           getattr(Volume.default_gateway_caps,"host files")
+    v = Volume(name="private_" + sliceName, owner_id=user, description="private volume for %s" % sliceName, blocksize=61440, private=True, archive=False, default_gateway_caps = caps)
+    v.save()
+    return v
+
+SYNDICATE_REPLICATE_PORTNUM = 1025
+
+def get_free_port():
+    inuse={}
+    inuse[SYNDICATE_REPLICATE_PORTNUM] = True
+    for vs in VolumeSlice.objects.all():
+        inuse[vs.peer_portnum]=True
+        inuse[vs.replicate_portnum]=True
+    for network in Network.objects.all():
+        if not network.ports:
+            continue
+        network_ports = [x.strip() for x in network.ports.split(",")]
+        for network_port in network_ports:
+            try:
+                inuse[int(network_port)] = True
+            except:
+                # in case someone has put a malformed port number in the list
+                pass
+    for i in range(1025, 65535):
+        if not inuse.get(i,False):
+            return i
+    return False
+
+def mountVolume(sliceName, volumeName, readWrite):
+    slice = Slice.objects.get(name=sliceName)
+    volume = Volume.objects.get(name=volumeName)
+    # choose some unused port numbers
+    flags = Volume.CAP_READ_DATA
+    if readWrite:
+        flags = flags | Volume.CAP_WRITE_DATA
+    vs = VolumeSlice(volume_id = volume, slice_id = slice, gateway_caps=flags, peer_portnum = get_free_port(), replicate_portnum = SYNDICATE_REPLICATE_PORTNUM)
+    vs.save()
+
+def hasPrivateVolume(sliceName):
+     slice = Slice.objects.get(name=sliceName)
+     for vs in VolumeSlice.objects.filter(slice_id=slice):
+         if vs.volume_id.private:
+             return True
+     return False
+
+def getMountDataSets():
+        dataSetInfo=[]\r
+        for volume in Volume.objects.all():\r
+            if not volume.private:\r
+                dataSetInfo.append({'DataSet': volume.name})\r
+\r
+        return dataSetInfo
+
+def getDeploymentSites():
+    deploymentList = Deployment.objects.all()
+    deploymentInfo = []
+    for entry in deploymentList:
+        deploymentInfo.append({'DeploymentSite':entry.name})
+    return deploymentInfo
+
+class TenantDeleteSliceView(View):
+        def post(self,request):\r
+                if request.user.isReadOnlyUser():\r
+                    return HttpResponseForbidden("User is in read-only mode")\r
+                sliceName = request.POST.get("sliceName",None)\r
+                slice = Slice.objects.get(name=sliceName)\r
+                #print slice, slice.id\r
+                sliceToDel=Slice(name=sliceName, id=slice.id)\r
+                sliceToDel.delete()
+                return HttpResponse(json.dumps("Slice deleted"), mimetype='application/javascript')
+
+class TenantAddOrRemoveSliverView(View):
+    """ Add or remove slivers from a Slice
+
+        Arguments:
+            siteName - name of site. If not specified, PlanetStack will pick the
+                       best site.,
+            actionToDo - [add | rem]
+            count - number of slivers to add or remove
+            sliceName - name of slice
+            noAct - if set, no changes will be made to db, but result will still
+                    show which sites would have been modified.
+
+        Returns:
+            Dictionary of sites that were modified, and the count of nodes
+            that were added or removed at each site.
+    """
+    def post(self, request, *args, **kwargs):
+        siteName = request.POST.get("siteName", None)
+        actionToDo = request.POST.get("actionToDo", None)
+        count = int(request.POST.get("count","0"))
+       sliceName = request.POST.get("slice", None)
+        noAct = request.POST.get("noAct", False)
+
+        if not sliceName:
+            return HttpResponseServerError("No slice name given")
+
+        slice = Slice.objects.get(name=sliceName)
+
+        if siteName:
+            siteList = [Site.objects.get(name=siteName)]
+        else:
+            siteList = None
+
+        if (actionToDo == "add"):
+            user_ip = request.GET.get("ip", get_ip(request))
+            if (siteList is None):
+                siteList = tenant_pick_sites(user, user_ip, slice, count)
+
+            sitesChanged = slice_increase_slivers(request.user, user_ip, siteList, slice, count, noAct)
+        elif (actionToDo == "rem"):
+            sitesChanged = slice_decrease_slivers(request.user, siteList, slice, count, noAct)
+        else:
+            return HttpResponseServerError("Unknown actionToDo %s" % actionToDo)
+
+        return HttpResponse(json.dumps(sitesChanged), mimetype='application/javascript')
+
+    def get(self, request, *args, **kwargs):
+        request.POST = request.GET
+        return self.post(request, *args, **kwargs)  # for testing REST in browser
+        #return HttpResponseServerError("GET is not supported")
+
+class TenantPickSitesView(View):
+    """ primarily just for testing purposes """
+    def get(self, request, *args, **kwargs):
+        count = request.GET.get("count","0")
+       slice = request.GET.get("slice",None)
+        if slice:
+            slice = Slice.objects.get(name=slice)
+        ip = request.GET.get("ip", get_ip(request))
+        sites = tenant_pick_sites(request.user, user_ip=ip, count=0, slice=slice)
+        sites = [x.name for x in sites]
+        return HttpResponse(json.dumps(sites), mimetype='application/javascript')
+
+def siteSortKey(site, slice=None, count=None, lat=None, lon=None):
+    # try to pick a site we're already using
+    has_slivers_here=False
+    if slice:
+        for sliver in slice.slivers.all():
+            if sliver.node.site.name == site.name:
+                has_slivers_here=True
+
+    # Haversine method
+    d = haversine(site.location.latitude, site.location.longitude, lat, lon)
+
+    return (-has_slivers_here, d)
+
+def tenant_pick_sites(user, user_ip=None, slice=None, count=None):
+    """ Returns list of sites, sorted from most favorable to least favorable """
+    lat=None
+    lon=None
+    try:
+        client_geo = GeoIP().city(user_ip)
+        if client_geo:
+            lat=float(client_geo["latitude"])
+            lon=float(client_geo["longitude"])
+    except:
+        print "exception in geo code"
+        traceback.print_exc()
+
+    sites = Site.objects.all()
+    sites = [x for x in sites if x.name in BLESSED_SITES]
+    sites = sorted(sites, key=functools.partial(siteSortKey, slice=slice, count=count, lat=lat, lon=lon))
+
+    return sites
+
+class TenantViewData(View):
+    def get(self, request, **kwargs):
+        return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
diff --git a/planetstack/core/dashboard/views/test.py b/planetstack/core/dashboard/views/test.py
new file mode 100644 (file)
index 0000000..24380c5
--- /dev/null
@@ -0,0 +1,5 @@
+from view_common import *
+
+class DashboardUserSiteView(View):
+    def get(self, request, **kwargs):
+        return HttpResponse(json.dumps(getDashboardContext(request.user, tableFormat=True)), mimetype='application/javascript')
diff --git a/planetstack/core/dashboard/views/view_common.py b/planetstack/core/dashboard/views/view_common.py
new file mode 100644 (file)
index 0000000..4efb8c2
--- /dev/null
@@ -0,0 +1,254 @@
+import os
+import sys
+from django.views.generic import TemplateView, View
+import datetime
+from pprint import pprint
+import json
+from syndicate.models import *
+from core.models import *
+from hpc.models import ContentProvider
+from operator import attrgetter
+from django import template
+from django.views.decorators.csrf import csrf_exempt
+from django.http import HttpResponse, HttpResponseServerError, HttpResponseForbidden
+from django.core import urlresolvers
+from django.contrib.gis.geoip import GeoIP
+from django.db.models import Q
+from ipware.ip import get_ip
+from operator import itemgetter, attrgetter
+import traceback
+import math
+
+if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"):
+    sys.path.append("/home/smbaker/projects/vicci/cdn/bigquery")
+else:
+    sys.path.append("/opt/planetstack/hpc_wizard")
+from planetstack_analytics import DoPlanetStackAnalytics, PlanetStackAnalytics, RED_LOAD, BLUE_LOAD
+
+def getDashboardContext(user, context={}, tableFormat = False):
+        context = {}
+
+        userSliceData = getSliceInfo(user)
+        if (tableFormat):
+            context['userSliceInfo'] = userSliceTableFormatter(userSliceData)
+        else:
+            context['userSliceInfo'] = userSliceData
+        context['cdnData'] = getCDNOperatorData(wait=False)
+        context['cdnContentProviders'] = getCDNContentProviderData()
+
+        (dashboards, unusedDashboards)= getDashboards(user)
+        unusedDashboards=[x for x in unusedDashboards if x!="Customize"]
+        context['dashboards'] = dashboards
+        context['unusedDashboards'] = unusedDashboards
+
+        return context
+
+def getDashboards(user):
+    dashboards = user.get_dashboards()
+
+    dashboard_names = [d.name for d in dashboards]
+
+    unused_dashboard_names = []
+    for dashboardView in DashboardView.objects.all():
+        if not dashboardView.name in dashboard_names:
+            unused_dashboard_names.append(dashboardView.name)
+
+    return (dashboard_names, unused_dashboard_names)
+
+def getSliceInfo(user):
+    sliceList = Slice.objects.all()
+    slicePrivs = SlicePrivilege.objects.filter(user=user)
+    userSliceInfo = []
+    for entry in slicePrivs:
+
+        slicename = Slice.objects.get(id=entry.slice.id).name
+        slice = Slice.objects.get(name=Slice.objects.get(id=entry.slice.id).name)
+        sliverList=Sliver.objects.all()
+        sites_used = {}
+        for sliver in slice.slivers.all():
+             #sites_used['deploymentSites'] = sliver.node.deployment.name
+             # sites_used[sliver.image.name] = sliver.image.name
+             sites_used[sliver.node.site.name] = sliver.numberCores
+        sliceid = Slice.objects.get(id=entry.slice.id).id
+        try:
+            sliverList = Sliver.objects.filter(slice=entry.slice.id)
+            siteList = {}
+            for x in sliverList:
+               if x.node.site not in siteList:
+                  siteList[x.node.site] = 1
+            slivercount = len(sliverList)
+            sitecount = len(siteList)
+        except:
+            traceback.print_exc()
+            slivercount = 0
+            sitecount = 0
+
+        userSliceInfo.append({'slicename': slicename, 'sliceid':sliceid,
+                              'sitesUsed':sites_used,
+                              'role': SliceRole.objects.get(id=entry.role.id).role,
+                              'slivercount': slivercount,
+                              'sitecount':sitecount})
+
+    return userSliceInfo
+
+def getCDNContentProviderData():
+    cps = []
+    for dm_cp in ContentProvider.objects.all():
+        cp = {"name": dm_cp.name,
+              "account": dm_cp.account}
+        cps.append(cp)
+
+    return cps
+
+def getCDNOperatorData(randomizeData = False, wait=True):
+    HPC_SLICE_NAME = "HyperCache"
+
+    bq = PlanetStackAnalytics()
+
+    rows = bq.get_cached_query_results(bq.compose_cached_query(), wait)
+
+    # wait=False on the first time the Dashboard is opened. This means we might
+    # not have any rows yet. The dashboard code polls every 30 seconds, so it
+    # will eventually pick them up.
+
+    if rows:
+        rows = bq.postprocess_results(rows, filter={"event": "hpc_heartbeat"}, maxi=["cpu"], count=["hostname"], computed=["bytes_sent/elapsed"], groupBy=["Time","site"], maxDeltaTime=80)
+
+        # dictionaryize the statistics rows by site name
+        stats_rows = {}
+        for row in rows:
+            stats_rows[row["site"]] = row
+    else:
+        stats_rows = {}
+
+    slice = Slice.objects.filter(name=HPC_SLICE_NAME)
+    if slice:
+        slice_slivers = list(slice[0].slivers.all())
+    else:
+        slice_slivers = []
+
+    new_rows = {}
+    for site in Site.objects.all():
+        # compute number of slivers allocated in the data model
+        allocated_slivers = 0
+        for sliver in slice_slivers:
+            if sliver.node.site == site:
+                allocated_slivers = allocated_slivers + 1
+
+        stats_row = stats_rows.get(site.name,{})
+
+        max_cpu = stats_row.get("max_avg_cpu", stats_row.get("max_cpu",0))
+        cpu=float(max_cpu)/100.0
+        hotness = max(0.0, ((cpu*RED_LOAD) - BLUE_LOAD)/(RED_LOAD-BLUE_LOAD))
+
+        # format it to what that CDN Operations View is expecting
+        new_row = {"lat": float(site.location.longitude),
+               "long": float(site.location.longitude),
+               "lat": float(site.location.latitude),
+               "health": 0,
+               "numNodes": int(site.nodes.count()),
+               "activeHPCSlivers": int(stats_row.get("count_hostname", 0)),     # measured number of slivers, from bigquery statistics
+               "numHPCSlivers": allocated_slivers,                              # allocated number of slivers, from data model
+               "siteUrl": str(site.site_url),
+               "bandwidth": stats_row.get("sum_computed_bytes_sent_div_elapsed",0),
+               "load": max_cpu,
+               "hot": float(hotness)}
+        new_rows[str(site.name)] = new_row
+
+    # get rid of sites with 0 slivers that overlap other sites with >0 slivers
+    for (k,v) in new_rows.items():
+        bad=False
+        if v["numHPCSlivers"]==0:
+            for v2 in new_rows.values():
+                if (v!=v2) and (v2["numHPCSlivers"]>=0):
+                    d = haversine(v["lat"],v["long"],v2["lat"],v2["long"])
+                    if d<100:
+                         bad=True
+            if bad:
+                del new_rows[k]
+
+    return new_rows
+
+def slice_increase_slivers(user, user_ip, siteList, slice, count, noAct=False):
+    sitesChanged = {}
+
+    # let's compute how many slivers are in use in each node of each site
+    for site in siteList:
+        site.nodeList = list(site.nodes.all())
+        for node in site.nodeList:
+            node.sliverCount = 0
+            for sliver in node.slivers.all():
+                 if sliver.slice.id == slice.id:
+                     node.sliverCount = node.sliverCount + 1
+
+    # Allocate slivers to nodes
+    # for now, assume we want to allocate all slivers from the same site
+    nodes = siteList[0].nodeList
+    while (count>0):
+        # Sort the node list by number of slivers per node, then pick the
+        # node with the least number of slivers.
+        nodes = sorted(nodes, key=attrgetter("sliverCount"))
+        node = nodes[0]
+
+        print "adding sliver at node", node.name, "of site", node.site.name
+
+        if not noAct:
+            sliver = Sliver(name=node.name,
+                        slice=slice,
+                        node=node,
+                        image = Image.objects.all()[0],
+                        creator = User.objects.get(email=user),
+                        deploymentNetwork=node.deployment,
+                        numberCores =1 )
+            sliver.save()
+
+        node.sliverCount = node.sliverCount + 1
+
+        count = count - 1
+
+        sitesChanged[node.site.name] = sitesChanged.get(node.site.name,0) + 1
+
+    return sitesChanged
+
+def slice_decrease_slivers(user, siteList, slice, count, noAct=False):
+    sitesChanged = {}
+    sliverList ={}
+    if siteList:
+        siteNames = [site.name for site in siteList]
+    else:
+        siteNames = None
+
+    for sliver in slice.slivers.all():
+        if(not siteNames) or (sliver.node.site.name in siteNames):\r
+                node = sliver.node\r
+                sliverList[sliver.name]=node.name
+
+    for key in sliverList:
+        if count>0:
+            sliver = Sliver.objects.filter(name=key)[0]\r
+            sliver.delete()\r
+            print "deleting sliver",sliverList[key],"at node",sliver.node.name\r
+            count=count-1\r
+            sitesChanged[sliver.node.site.name] = sitesChanged.get(sliver.node.site.name,0) - 1\r
+\r
+    return sitesChanged
+
+def haversine(site_lat, site_lon, lat, lon):
+    d=0
+    if lat and lon and site_lat and site_lon:
+        site_lat = float(site_lat)
+        site_lon = float(site_lon)
+        lat = float(lat)
+        lon = float(lon)
+        R = 6378.1
+        a = math.sin( math.radians((lat - site_lat)/2.0) )**2 + math.cos( math.radians(lat) )*math.cos( math.radians(site_lat) )*(math.sin( math.radians((lon - site_lon)/2.0 ) )**2)
+        c = 2 * math.atan2( math.sqrt(a), math.sqrt(1 - a) )
+        d = R * c
+
+    return d
+
+def userSliceTableFormatter(data):
+    formattedData = {
+                     'rows' : data
+                    }
+    return formattedData
index 8905b47..36ae176 100644 (file)
@@ -7,9 +7,10 @@
         "description": "Used to help accelerate delivery of content through the CDN.", 
         "created": "2013-11-26T12:45:24.212Z", 
         "enabled": true, 
+        "name": "HPC Service", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "HPC Service"
+        "enacted": null
     }
 },
 {
         "description": "Service to help load balance and direct traffic flow to content within the CDN", 
         "created": "2013-11-26T12:45:59.003Z", 
         "enabled": true, 
+        "name": "Request Router Service", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "Request Router Service"
+        "enacted": null
     }
 },
 {
         "description": "Syndicate Shared Filesystem.", 
         "created": "2013-12-04T22:51:07.137Z", 
         "enabled": true, 
+        "name": "Syndicate", 
         "versionNumber": "", 
         "published": true, 
-        "name": "Syndicate"
+        "enacted": null
     }
 },
 {
         "description": "A provisioning service for long-term experiments.", 
         "created": "2013-12-13T21:48:58.304Z", 
         "enabled": true, 
+        "name": "Raven", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "Raven"
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.service", 
+    "fields": {
+        "updated": "2014-05-20T18:56:51.847Z", 
+        "description": "Cassandra distributed database management system", 
+        "created": "2014-05-20T18:56:51.847Z", 
+        "enabled": true, 
+        "name": "Cassandra", 
+        "versionNumber": "2.0.7", 
+        "published": true, 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.service", 
+    "fields": {
+        "updated": "2014-05-20T18:57:33.778Z", 
+        "description": "KairosDB Time Series Database Service", 
+        "created": "2014-05-20T18:57:33.778Z", 
+        "enabled": true, 
+        "name": "KairosDB", 
+        "versionNumber": "0.9.3", 
+        "published": true, 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.service", 
+    "fields": {
+        "updated": "2014-05-20T18:58:53.563Z", 
+        "description": "Nagios Monitoring Service", 
+        "created": "2014-05-20T18:58:53.563Z", 
+        "enabled": true, 
+        "name": "Nagios", 
+        "versionNumber": "4.0.6", 
+        "published": true, 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:47.910Z", 
         "name": "Stanford", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.stanford.edu/", 
         "location": "37.4294,-122.17200000000003", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            5
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:38.431Z", 
         "name": "Washington", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "https://www.washington.edu/", 
         "location": "47.6531,-122.31299999999999", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            6
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:28.495Z", 
         "name": "Princeton", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://princeton.edu/", 
         "location": "40.3502,-74.6524", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            7
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:18.964Z", 
         "name": "GeorgiaTech", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.gatech.edu/", 
         "location": "33.7772,-84.39760000000001", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            8
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:07.704Z", 
         "name": "MaxPlanck", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.mpi-sws.mpg.de/", 
         "location": "49.14,6.588999999999942", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            9
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Atlanta", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "33.0075,-84.0038", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Chicago", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "41.0085,-87.0065", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Houston", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "29.0077,-95.0037", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Kansas City", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "39.0012,-94.0063", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Los Angeles", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "33.2505,-117.503", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 New York", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "40.72,-73.99", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Salt Lake City", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "40.7659,-111.844", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
     "pk": 20, 
     "model": "core.site", 
     "fields": {
-        "updated": "2013-06-21T21:17:13.982Z", 
+        "updated": "2014-03-22T06:27:07.824Z", 
         "name": "I2 Seattle", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
-        "site_url": "http://www.internet2.edu", 
+        "site_url": "http://www.internet2.edu/", 
         "login_base": "i2seat", 
-        "location": "47.6531,-122.313", 
+        "location": "47.6531,-122.31299999999999", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Washington DC", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "38.009,-77.0003", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T17:30:14.491Z", 
         "name": "ON.Lab", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.onlab.us/", 
         "location": "37.452955,-122.18176599999998", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            5, 
-            6, 
-            7, 
-            8, 
-            9, 
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:21:43.870Z", 
         "name": "I2 Singapore", 
         "created": "2013-12-17T17:08:49.669Z", 
-        "tenant_id": null, 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu/", 
         "location": "1.33544,103.88999999999999", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:08:01.373Z", 
         "name": "Arizona", 
         "created": "2013-12-17T18:07:14.190Z", 
-        "tenant_id": null, 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.cs.arizona.edu/", 
         "location": "32.2333,-110.94799999999998", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": []
-        "abbreviated_name": ""
+        "abbreviated_name": ""
+        "enacted": null
     }
 },
 {
     "model": "core.siterole", 
     "fields": {
         "updated": "2013-12-17T18:08:54.842Z", 
+        "enacted": null, 
         "role": "pi", 
         "created": "2013-12-17T18:08:54.842Z"
     }
 },
+{
+    "pk": 2, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:09.655Z", 
+        "enacted": null, 
+        "role": "admin", 
+        "created": "2014-04-22T11:34:09.655Z"
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:27.403Z", 
+        "enacted": null, 
+        "role": "tech", 
+        "created": "2014-04-22T11:34:27.403Z"
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:39.770Z", 
+        "enacted": null, 
+        "role": "billing", 
+        "created": "2014-04-22T11:34:39.770Z"
+    }
+},
 {
     "pk": 5, 
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Stanford", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Washington", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Princeton", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-GeorgiaTech", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "EU-MaxPlanck", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "Internet2", 
         "created": "2013-04-03T22:57:23.015Z"
     }
 },
+{
+    "pk": 11, 
+    "model": "core.deployment", 
+    "fields": {
+        "updated": "2014-05-22T22:49:27.623Z", 
+        "enacted": null, 
+        "name": "Amazon EC2", 
+        "created": "2014-05-22T22:49:27.623Z"
+    }
+},
 {
     "pk": 1, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "padmin@vicci.org", 
-        "public_key": null, 
-        "updated": "2013-11-26T12:36:49.829Z", 
-        "is_readonly": false, 
-        "firstname": "OpenCloud", 
-        "user_url": null, 
-        "lastname": "Admin", 
-        "created": "2013-11-26T12:36:49.816Z", 
-        "is_active": true, 
-        "site": null, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-13T05:21:52.645Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$v5qKhIyhSQ2N$V8vh2mkqYdjQib6d2jBkpwV57eMBfhd/9eiXqaDLUWg=", 
-        "email": "padmin@vicci.org", 
+        "updated": "2014-05-07T23:52:01.453Z", 
+        "created": "2014-05-07T23:52:01.453Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 5, 
         "enacted": null
     }
 },
 {
     "pk": 2, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "tony@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Tony", 
-        "user_url": null, 
-        "lastname": "Mack", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
+        "updated": "2014-05-07T23:52:01.455Z", 
+        "created": "2014-05-07T23:52:01.455Z", 
+        "tenant_id": null, 
         "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-14T03:21:24.872Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "tony@onlab.us", 
+        "deployment": 6, 
         "enacted": null
     }
 },
 {
     "pk": 3, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "mike@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Mike", 
-        "user_url": null, 
-        "lastname": "Wawrzoniak", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
+        "updated": "2014-05-07T23:52:01.456Z", 
+        "created": "2014-05-07T23:52:01.456Z", 
+        "tenant_id": null, 
         "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-04T20:46:15.904Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "mike@onlab.us", 
+        "deployment": 7, 
         "enacted": null
     }
 },
 {
     "pk": 4, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "andy@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Andy", 
-        "user_url": null, 
-        "lastname": "Bavier", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
+        "updated": "2014-05-07T23:52:01.457Z", 
+        "created": "2014-05-07T23:52:01.456Z", 
+        "tenant_id": null, 
         "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-17T18:22:01.970Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "andy@onlab.us", 
+        "deployment": 8, 
         "enacted": null
     }
 },
 {
     "pk": 5, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "sapan@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Sapan", 
-        "user_url": null, 
-        "lastname": "Bhatia", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
+        "updated": "2014-05-07T23:52:01.457Z", 
+        "created": "2014-05-07T23:52:01.457Z", 
+        "tenant_id": null, 
         "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-17T16:21:46.493Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "sapan@onlab.us", 
+        "deployment": 9, 
         "enacted": null
     }
 },
 {
     "pk": 6, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "jcnelson@cs.princeton.edu", 
-        "public_key": "", 
-        "updated": "2013-12-16T15:44:27.429Z", 
-        "is_readonly": false, 
-        "firstname": "Jude", 
-        "user_url": null, 
-        "lastname": "Nelson", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
-        "site": 10, 
-        "phone": "", 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "jcnelson@cs.princeton.edu", 
+        "updated": "2014-05-07T23:52:01.458Z", 
+        "created": "2014-05-07T23:52:01.458Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 10, 
         "enacted": null
     }
 },
 {
     "pk": 7, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "llp@onlab.us", 
-        "public_key": "", 
-        "updated": "2013-12-04T20:47:03.679Z", 
-        "is_readonly": false, 
-        "firstname": "Larry", 
-        "user_url": null, 
-        "lastname": "Peterson", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
-        "site": 22, 
-        "phone": "", 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-17T17:29:10.464Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "llp@onlab.us", 
+        "updated": "2014-05-08T00:00:37.305Z", 
+        "created": "2014-05-08T00:00:37.305Z", 
+        "tenant_id": null, 
+        "site": 23, 
+        "deployment": 10, 
         "enacted": null
     }
 },
 {
     "pk": 8, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "scott@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Scott", 
-        "user_url": null, 
-        "lastname": "Baker", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
-        "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-12-12T17:31:25.520Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "scott@onlab.us", 
+        "updated": "2014-05-08T00:01:18.181Z", 
+        "created": "2014-05-08T00:01:18.181Z", 
+        "tenant_id": null, 
+        "site": 21, 
+        "deployment": 10, 
         "enacted": null
     }
 },
 {
     "pk": 9, 
-    "model": "core.user", 
+    "model": "core.sitedeployments", 
     "fields": {
-        "username": "ali@onlab.us", 
-        "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
-        "is_readonly": false, 
-        "firstname": "Ali", 
-        "user_url": null, 
-        "lastname": "Al-Shabibi", 
-        "created": "2013-09-22T21:47:30.959Z", 
-        "is_active": true, 
-        "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
-        "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
-        "timezone": "America/New_York", 
-        "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "ali@onlab.us", 
+        "updated": "2014-05-08T00:01:29.768Z", 
+        "created": "2014-05-08T00:01:29.768Z", 
+        "tenant_id": null, 
+        "site": 20, 
+        "deployment": 10, 
         "enacted": null
     }
 },
 {
     "pk": 10, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:01:52.173Z", 
+        "created": "2014-05-08T00:01:52.173Z", 
+        "tenant_id": null, 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:03.435Z", 
+        "created": "2014-05-08T00:02:03.435Z", 
+        "tenant_id": null, 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:16.038Z", 
+        "created": "2014-05-08T00:02:16.038Z", 
+        "tenant_id": null, 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:33.626Z", 
+        "created": "2014-05-08T00:02:33.626Z", 
+        "tenant_id": null, 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 14, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:46.549Z", 
+        "created": "2014-05-08T00:02:46.549Z", 
+        "tenant_id": null, 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 15, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:01.445Z", 
+        "created": "2014-05-08T00:03:01.445Z", 
+        "tenant_id": null, 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 16, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:18.238Z", 
+        "created": "2014-05-08T00:03:18.238Z", 
+        "tenant_id": null, 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 17, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:32.156Z", 
+        "created": "2014-05-08T00:03:32.156Z", 
+        "tenant_id": null, 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 18, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:45.449Z", 
+        "created": "2014-05-08T00:03:45.448Z", 
+        "tenant_id": null, 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 19, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:59.510Z", 
+        "created": "2014-05-08T00:03:59.510Z", 
+        "tenant_id": null, 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 20, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:04:12.516Z", 
+        "created": "2014-05-08T00:04:12.516Z", 
+        "tenant_id": null, 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 21, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:04:25.576Z", 
+        "created": "2014-05-08T00:04:25.576Z", 
+        "tenant_id": null, 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:developer", 
+        "updated": "2014-05-19T22:11:11.408Z", 
+        "enacted": null, 
+        "name": "Developer", 
+        "created": "2014-05-19T22:11:11.408Z"
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:cdnoperations", 
+        "updated": "2014-05-19T22:11:32.782Z", 
+        "enacted": null, 
+        "name": "CDN Operations", 
+        "created": "2014-05-19T22:11:32.781Z"
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:tenant", 
+        "updated": "2014-05-19T22:11:46.731Z", 
+        "enacted": null, 
+        "name": "Tenant", 
+        "created": "2014-05-19T22:11:46.731Z"
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:hpc_historical", 
+        "updated": "2014-05-19T22:11:59.956Z", 
+        "enacted": null, 
+        "name": "Historical", 
+        "created": "2014-05-19T22:11:59.956Z"
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:customize", 
+        "updated": "2014-05-20T00:32:44.462Z", 
+        "enacted": null, 
+        "name": "Customize", 
+        "created": "2014-05-20T00:32:44.462Z"
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:slice_interactions", 
+        "updated": "2014-05-20T00:33:32.454Z", 
+        "enacted": null, 
+        "name": "Slice Interactions", 
+        "created": "2014-05-20T00:33:32.454Z"
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:cdn_nodes", 
+        "updated": "2014-05-26T23:12:15.410Z", 
+        "enacted": null, 
+        "name": "CDN Nodes", 
+        "created": "2014-05-20T00:33:52.101Z"
+    }
+},
+{
+    "pk": 1, 
     "model": "core.user", 
     "fields": {
-        "username": "bill@onlab.us", 
+        "username": "padmin@vicci.org", 
         "public_key": null, 
-        "updated": "2013-09-22T21:47:30.993Z", 
+        "updated": "2013-11-26T12:36:49.829Z", 
         "is_readonly": false, 
-        "firstname": "Bill", 
+        "firstname": "OpenCloud", 
         "user_url": null, 
-        "lastname": "Snow", 
-        "created": "2013-09-22T21:47:30.959Z", 
+        "lastname": "Admin", 
+        "created": "2013-11-26T12:36:49.816Z", 
         "is_active": true, 
-        "site": 22
+        "site": null
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
+        "last_login": "2014-03-23T13:57:56.529Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "bill@onlab.us", 
+        "password": "pbkdf2_sha256$10000$v5qKhIyhSQ2N$V8vh2mkqYdjQib6d2jBkpwV57eMBfhd/9eiXqaDLUWg=", 
+        "email": "padmin@vicci.org", 
         "enacted": null
     }
 },
 {
-    "pk": 11
+    "pk": 2
     "model": "core.user", 
     "fields": {
-        "username": "guru@onlab.us", 
-        "public_key": null
-        "updated": "2013-09-22T21:47:30.993Z", 
+        "username": "tmack@cs.princeton.edu", 
+        "public_key": ""
+        "updated": "2014-03-23T23:10:57.378Z", 
         "is_readonly": false, 
-        "firstname": "Guru", 
+        "firstname": "Tony", 
         "user_url": null, 
-        "lastname": "Parulkar", 
+        "lastname": "Mack", 
         "created": "2013-09-22T21:47:30.959Z", 
         "is_active": true, 
-        "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
+        "site": 10, 
+        "phone": "", 
         "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
+        "last_login": "2013-12-14T03:21:24.872Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
         "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "guru@onlab.us", 
+        "email": "tmack@cs.princeton.edu", 
         "enacted": null
     }
 },
 {
-    "pk": 12
+    "pk": 3
     "model": "core.user", 
     "fields": {
-        "username": "marc@onlab.us", 
-        "public_key": null
-        "updated": "2013-09-22T21:47:30.993Z", 
+        "username": "mhw@cs.princeton.edu", 
+        "public_key": ""
+        "updated": "2014-03-23T23:10:01.387Z", 
         "is_readonly": false, 
-        "firstname": "Marc", 
+        "firstname": "Mike", 
         "user_url": null, 
-        "lastname": "Fiuczynski", 
+        "lastname": "Wawrzoniak", 
         "created": "2013-09-22T21:47:30.959Z", 
         "is_active": true, 
-        "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
+        "site": 10, 
+        "phone": "", 
         "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
+        "last_login": "2013-12-04T20:46:15.904Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
         "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "marc@onlab.us", 
+        "email": "mhw@cs.princeton.edu", 
         "enacted": null
     }
 },
 {
-    "pk": 13
+    "pk": 4
     "model": "core.user", 
     "fields": {
-        "username": "siobhan@onlab.us", 
-        "public_key": null
-        "updated": "2013-09-22T21:47:30.993Z", 
+        "username": "acb@cs.princeton.edu", 
+        "public_key": ""
+        "updated": "2014-03-23T23:09:34.844Z", 
         "is_readonly": false, 
-        "firstname": "Siobhan", 
+        "firstname": "Andy", 
         "user_url": null, 
-        "lastname": "Tully", 
+        "lastname": "Bavier", 
         "created": "2013-09-22T21:47:30.959Z", 
         "is_active": true, 
-        "site": 22, 
-        "phone": null, 
-        "kuser_id": null, 
+        "site": 10, 
+        "phone": "", 
         "is_staff": true, 
-        "last_login": "2013-09-22T21:48:01.047Z", 
+        "last_login": "2014-05-12T19:20:28.533Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
         "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
-        "email": "siobhan@onlab.us", 
+        "email": "acb@cs.princeton.edu", 
         "enacted": null
     }
 },
 {
-    "pk": 14
+    "pk": 5
     "model": "core.user", 
     "fields": {
-        "username": "demo@onlab.us", 
+        "username": "sapanb@cs.princeton.edu", 
         "public_key": "", 
-        "updated": "2013-12-06T11:25:52.457Z", 
-        "is_readonly": true, 
-        "firstname": "Demo", 
+        "updated": "2014-03-23T23:10:35.450Z", 
+        "is_readonly": false, 
+        "firstname": "Sapan", 
         "user_url": null, 
-        "lastname": "OpenCloud", 
-        "created": "2013-12-06T11:25:41.211Z", 
+        "lastname": "Bhatia", 
+        "created": "2013-09-22T21:47:30.959Z", 
         "is_active": true, 
-        "site": 22
+        "site": 10
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
-        "last_login": "2013-12-17T18:54:01.976Z", 
+        "last_login": "2014-05-09T18:41:01.026Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
-        "password": "pbkdf2_sha256$10000$jaLSTW2ksHEN$HDpjDKieFDjMvtV5wbF/ow3zfq8EqcFtNXLfuo+150s=", 
-        "email": "demo@onlab.us", 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "sapanb@cs.princeton.edu", 
         "enacted": null
     }
 },
 {
-    "pk": 15
+    "pk": 6
     "model": "core.user", 
     "fields": {
-        "username": "jhh@cs.arizona.edu", 
+        "username": "jcnelson@cs.princeton.edu", 
         "public_key": "", 
-        "updated": "2013-12-17T18:08:58.288Z", 
+        "updated": "2013-12-16T15:44:27.429Z", 
         "is_readonly": false, 
-        "firstname": "John", 
+        "firstname": "Jude", 
         "user_url": null, 
-        "lastname": "Hartman", 
-        "created": "2013-12-17T18:08:01.381Z", 
+        "lastname": "Nelson", 
+        "created": "2013-09-22T21:47:30.959Z", 
         "is_active": true, 
-        "site": 24
+        "site": 10
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
-        "last_login": "2013-12-17T18:08:01.356Z", 
+        "last_login": "2014-05-09T02:08:32.840Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
-        "password": "!", 
-        "email": "jhh@cs.arizona.edu", 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "jcnelson@cs.princeton.edu", 
         "enacted": null
     }
 },
 {
-    "pk": 1, 
-    "model": "core.serviceclass", 
-    "fields": {
+    "pk": 7, 
+    "model": "core.user", 
+    "fields": {
+        "username": "llp@onlab.us", 
+        "public_key": "", 
+        "updated": "2014-03-23T23:11:22.436Z", 
+        "is_readonly": false, 
+        "firstname": "Larry", 
+        "user_url": null, 
+        "lastname": "Peterson", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": "", 
+        "is_staff": true, 
+        "last_login": "2014-05-10T15:19:58.401Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$EOrqG6KzVO8z$4jSJMN/35PKPmJkDEHjAY1c/mDpBfoW1U8XAfk1eDLk=", 
+        "email": "llp@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 8, 
+    "model": "core.user", 
+    "fields": {
+        "username": "scott@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Scott", 
+        "user_url": null, 
+        "lastname": "Baker", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2014-05-26T23:11:54.353Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "scott@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 9, 
+    "model": "core.user", 
+    "fields": {
+        "username": "ali@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Ali", 
+        "user_url": null, 
+        "lastname": "Al-Shabibi", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2013-09-22T21:48:01.047Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "ali@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 10, 
+    "model": "core.user", 
+    "fields": {
+        "username": "bill@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Bill", 
+        "user_url": null, 
+        "lastname": "Snow", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2013-09-22T21:48:01.047Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "bill@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.user", 
+    "fields": {
+        "username": "guru@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Guru", 
+        "user_url": null, 
+        "lastname": "Parulkar", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2013-09-22T21:48:01.047Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "guru@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.user", 
+    "fields": {
+        "username": "marc@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Marc", 
+        "user_url": null, 
+        "lastname": "Fiuczynski", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2013-09-22T21:48:01.047Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "marc@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.user", 
+    "fields": {
+        "username": "siobhan@onlab.us", 
+        "public_key": null, 
+        "updated": "2013-09-22T21:47:30.993Z", 
+        "is_readonly": false, 
+        "firstname": "Siobhan", 
+        "user_url": null, 
+        "lastname": "Tully", 
+        "created": "2013-09-22T21:47:30.959Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": null, 
+        "is_staff": true, 
+        "last_login": "2013-09-22T21:48:01.047Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$dLKRXWJlkuvm$Ycamy79oT1lN0Q5R3B3nvlr70n2X50mL86yraDwzuWk=", 
+        "email": "siobhan@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 14, 
+    "model": "core.user", 
+    "fields": {
+        "username": "demo@onlab.us", 
+        "public_key": "", 
+        "updated": "2014-05-23T22:03:14.065Z", 
+        "is_readonly": true, 
+        "firstname": "Demo", 
+        "user_url": null, 
+        "lastname": "OpenCloud", 
+        "created": "2013-12-06T11:25:41.211Z", 
+        "is_active": true, 
+        "site": 22, 
+        "phone": "", 
+        "is_staff": true, 
+        "last_login": "2014-05-23T22:03:56.256Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "pbkdf2_sha256$10000$jaLSTW2ksHEN$HDpjDKieFDjMvtV5wbF/ow3zfq8EqcFtNXLfuo+150s=", 
+        "email": "demo@onlab.us", 
+        "enacted": null
+    }
+},
+{
+    "pk": 15, 
+    "model": "core.user", 
+    "fields": {
+        "username": "jhh@cs.arizona.edu", 
+        "public_key": "", 
+        "updated": "2013-12-17T18:08:58.288Z", 
+        "is_readonly": false, 
+        "firstname": "John", 
+        "user_url": null, 
+        "lastname": "Hartman", 
+        "created": "2013-12-17T18:08:01.381Z", 
+        "is_active": true, 
+        "site": 24, 
+        "phone": "", 
+        "is_staff": true, 
+        "last_login": "2013-12-17T18:08:01.356Z", 
+        "timezone": "America/New_York", 
+        "is_admin": true, 
+        "password": "!", 
+        "email": "jhh@cs.arizona.edu", 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-23T22:03:14.097Z", 
+        "created": "2014-05-23T22:03:14.097Z", 
+        "dashboardView": 1, 
+        "user": 14, 
+        "order": 0, 
+        "enacted": null
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-23T22:03:14.102Z", 
+        "created": "2014-05-23T22:03:14.102Z", 
+        "dashboardView": 2, 
+        "user": 14, 
+        "order": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-23T22:03:14.106Z", 
+        "created": "2014-05-23T22:03:14.106Z", 
+        "dashboardView": 4, 
+        "user": 14, 
+        "order": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-23T22:03:14.110Z", 
+        "created": "2014-05-23T22:03:14.110Z", 
+        "dashboardView": 6, 
+        "user": 14, 
+        "order": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-23T22:03:14.115Z", 
+        "created": "2014-05-23T22:03:14.115Z", 
+        "dashboardView": 3, 
+        "user": 14, 
+        "order": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-26T23:12:24.855Z", 
+        "created": "2014-05-26T23:12:24.855Z", 
+        "dashboardView": 3, 
+        "user": 8, 
+        "order": 0, 
+        "enacted": null
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.userdashboardview", 
+    "fields": {
+        "updated": "2014-05-26T23:12:24.895Z", 
+        "created": "2014-05-26T23:12:24.895Z", 
+        "dashboardView": 7, 
+        "user": 8, 
+        "order": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.serviceclass", 
+    "fields": {
         "updated": "2013-05-10T23:30:52.931Z", 
         "membershipFee": 0, 
+        "description": "Best Effort", 
         "membershipFeeMonths": 0, 
         "created": "2013-05-10T23:30:52.931Z", 
         "upgradeFrom": [
         "commitment": 0, 
         "name": "Best Effort", 
         "upgradeRequiresApproval": false, 
-        "description": "Best Effort"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-05-10T23:35:51.694Z", 
         "membershipFee": 100, 
+        "description": "Silver", 
         "membershipFeeMonths": 1, 
         "created": "2013-05-10T23:33:24.930Z", 
         "upgradeFrom": [
         "commitment": 365, 
         "name": "Silver", 
         "upgradeRequiresApproval": false, 
-        "description": "Silver"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-05-10T23:34:01.320Z", 
         "membershipFee": 18000, 
+        "description": "Gold", 
         "membershipFeeMonths": 12, 
         "created": "2013-05-10T23:34:01.320Z", 
         "upgradeFrom": [
         "commitment": 365, 
         "name": "Gold", 
         "upgradeRequiresApproval": false, 
-        "description": "Gold"
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:13:28.743Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "HyperCache", 
+        "service": 3, 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "slice_url": "", 
+        "description": "HyperCache slice for HyperCache service.", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:12:27.541Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "Syndicate", 
+        "service": 5, 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "slice_url": "", 
+        "description": "", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 10, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 8, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:17:33.686Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "DnsRedir", 
+        "service": 4, 
+        "created": "2013-12-04T22:48:35.584Z", 
+        "slice_url": "", 
+        "description": "DNS Redirection slice for RequestRouter service.", 
+        "serviceClass": 2, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 9, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:18:00.528Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "DnsDemux", 
+        "service": 4, 
+        "created": "2013-12-04T22:49:23.051Z", 
+        "slice_url": "", 
+        "description": "DNS Demultiplexing slice for RequestRouter service. ", 
+        "serviceClass": 2, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 10, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:19:56.253Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "Infrastructure", 
+        "service": null, 
+        "created": "2013-12-09T14:13:15.392Z", 
+        "slice_url": "", 
+        "description": "", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:15:29.953Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "Stork", 
+        "service": 8, 
+        "created": "2013-12-13T21:49:59.476Z", 
+        "slice_url": "", 
+        "description": "The Stork Package Management Service", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 24, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:16:01.742Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "Owl", 
+        "service": 8, 
+        "created": "2013-12-13T21:52:15.590Z", 
+        "slice_url": "", 
+        "description": "The Owl Data Collection service", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 24, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:15:02.712Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "Hadoop", 
+        "service": null, 
+        "created": "2013-12-13T21:54:20.895Z", 
+        "slice_url": "", 
+        "description": "Hadoop map-reduce service", 
+        "serviceClass": 2, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 14, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:14:27.648Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "test", 
+        "service": null, 
+        "created": "2013-12-13T21:56:57.299Z", 
+        "slice_url": "", 
+        "description": "Test slice number one.", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 10, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 15, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-03-23T23:14:00.911Z", 
+        "imagePreference": "Ubuntu 12.04 LTS", 
+        "name": "test2", 
+        "service": null, 
+        "created": "2013-12-13T22:00:03.049Z", 
+        "slice_url": "", 
+        "description": "test slice number two.", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 10, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 16, 
+    "model": "core.slice", 
+    "fields": {
+        "updated": "2014-05-20T23:46:20.205Z", 
+        "imagePreference": "Hadoop 2.4.0", 
+        "name": "Analytics", 
+        "service": null, 
+        "created": "2014-05-20T17:54:07.100Z", 
+        "slice_url": "", 
+        "description": "Analytics ", 
+        "serviceClass": 1, 
+        "enabled": true, 
+        "site": 22, 
+        "omf_friendly": false, 
+        "network": "Private Only", 
+        "max_slivers": 10, 
+        "mountDataSets": "GenBank", 
+        "creator": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.slicerole", 
+    "fields": {
+        "updated": "2013-12-18T21:09:27.717Z", 
+        "enacted": null, 
+        "role": "admin", 
+        "created": "2013-12-18T21:09:27.717Z"
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.slicerole", 
+    "fields": {
+        "updated": "2013-12-18T21:09:35.074Z", 
+        "enacted": null, 
+        "role": "default", 
+        "created": "2013-12-18T21:09:35.074Z"
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.713Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.713Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.729Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.729Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.739Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.739Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.752Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.752Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.771Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.771Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.790Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.789Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.808Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.808Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 8, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.835Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.835Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 9, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.862Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.862Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 10, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.890Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.890Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.925Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.925Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.960Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.960Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:37.996Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:37.996Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 14, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.038Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:38.038Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 15, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.092Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:21:38.091Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 16, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.103Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.103Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 17, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.111Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.111Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 18, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.122Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.122Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 19, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.141Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.141Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 20, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.160Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.160Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 21, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.179Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.179Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 22, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.206Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.206Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 23, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.233Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.233Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 24, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.260Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.260Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 25, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.287Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.287Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 26, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.322Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.322Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 27, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.358Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.358Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 28, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.393Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.393Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 29, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.428Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.428Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 30, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.472Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:21:38.472Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 31, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.484Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.484Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 32, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.492Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.492Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 33, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.503Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.503Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 34, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.522Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.522Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 35, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.540Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.540Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 36, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.559Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.559Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 37, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.578Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.578Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 38, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.605Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.605Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 39, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.632Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.632Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 40, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.660Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.660Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 41, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.695Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.695Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 42, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.731Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.731Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 43, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.766Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.766Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 44, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.801Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.801Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 45, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.845Z", 
+        "slice": 8, 
+        "created": "2013-12-18T21:21:38.845Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 46, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.857Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.857Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 47, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.865Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.864Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 48, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.875Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.875Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 49, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.894Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.894Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 50, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.913Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.913Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 51, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.932Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.932Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 52, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.951Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.951Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 53, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:38.978Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:38.978Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 54, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.005Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.005Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 55, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.032Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.032Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 56, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.068Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.067Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 57, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.103Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.103Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 58, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.139Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.139Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 59, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.175Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.175Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 60, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.219Z", 
+        "slice": 9, 
+        "created": "2013-12-18T21:21:39.219Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 61, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.229Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.229Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 62, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.238Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.238Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 63, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.248Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.248Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 64, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.267Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.267Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 65, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.286Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.286Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 66, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.304Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.304Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 67, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.324Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.324Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 68, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.351Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.351Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 69, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.378Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.378Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 70, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.405Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.405Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 71, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.440Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.440Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 72, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.476Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.476Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 73, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.511Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.511Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 74, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.547Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.547Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 75, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.590Z", 
+        "slice": 10, 
+        "created": "2013-12-18T21:21:39.590Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 76, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.602Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.602Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 77, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.610Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.610Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 78, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.621Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.621Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 79, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.640Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.640Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 80, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.659Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.659Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 81, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.678Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.678Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 82, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.705Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.705Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 83, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.732Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.732Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 84, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.759Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.759Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 85, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.786Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.786Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 86, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.821Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.821Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 87, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.857Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.857Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 88, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.891Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.891Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 89, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.927Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.927Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 90, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.971Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:21:39.971Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 91, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.983Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:39.983Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 92, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:39.991Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:39.991Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 93, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.002Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.002Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 94, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.020Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.020Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 95, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.039Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.039Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 96, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.058Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.058Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 97, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.077Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.077Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 98, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.104Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.104Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 99, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.131Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.131Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 100, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.159Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.159Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 101, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.194Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.194Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 102, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.230Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.230Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 103, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.265Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.265Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 104, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.300Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.300Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 105, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.344Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:21:40.344Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 106, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.356Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.355Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 107, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.364Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.364Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 108, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.374Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.374Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 109, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.393Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.393Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 110, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.412Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.412Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 111, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.431Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.431Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 112, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.450Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.450Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 113, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.477Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.477Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 114, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.504Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.504Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 115, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.531Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.531Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 116, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.566Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.566Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 117, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.602Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.602Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 118, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.637Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.637Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 119, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.673Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.673Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 120, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.717Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:21:40.717Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 121, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.728Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.728Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 122, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.736Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.736Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 123, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.747Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.747Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 124, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.766Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.766Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 125, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.784Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.784Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 126, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.803Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.803Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 127, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.822Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.822Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 128, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.849Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.849Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 129, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.877Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.877Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 130, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.903Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.903Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 131, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.939Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.939Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 132, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:40.975Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:40.975Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 133, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.010Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:41.010Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 134, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.045Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:41.045Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 135, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.089Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:21:41.089Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 136, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.101Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.101Z", 
+        "role": 1, 
+        "user": 2, 
+        "enacted": null
+    }
+},
+{
+    "pk": 137, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.109Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.109Z", 
+        "role": 1, 
+        "user": 3, 
+        "enacted": null
+    }
+},
+{
+    "pk": 138, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.119Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.119Z", 
+        "role": 1, 
+        "user": 4, 
+        "enacted": null
+    }
+},
+{
+    "pk": 139, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.138Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.138Z", 
+        "role": 1, 
+        "user": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 140, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.157Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.157Z", 
+        "role": 1, 
+        "user": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 141, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.176Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.176Z", 
+        "role": 1, 
+        "user": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 142, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.204Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.203Z", 
+        "role": 1, 
+        "user": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 143, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.231Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.231Z", 
+        "role": 1, 
+        "user": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 144, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.258Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.258Z", 
+        "role": 1, 
+        "user": 11, 
+        "enacted": null
+    }
+},
+{
+    "pk": 145, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.285Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.285Z", 
+        "role": 1, 
+        "user": 12, 
+        "enacted": null
+    }
+},
+{
+    "pk": 146, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.320Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.320Z", 
+        "role": 1, 
+        "user": 13, 
+        "enacted": null
+    }
+},
+{
+    "pk": 147, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.356Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.356Z", 
+        "role": 1, 
+        "user": 14, 
+        "enacted": null
+    }
+},
+{
+    "pk": 148, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.391Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.391Z", 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
+    }
+},
+{
+    "pk": 149, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.426Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.426Z", 
+        "role": 1, 
+        "user": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 150, 
+    "model": "core.sliceprivilege", 
+    "fields": {
+        "updated": "2013-12-18T21:21:41.470Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:21:41.470Z", 
+        "role": 1, 
+        "user": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.image", 
+    "fields": {
+        "updated": "2013-12-09T14:26:56.787Z", 
+        "name": "Fedora 16 LXC rev 1.3", 
+        "created": "2013-12-09T14:26:56.787Z", 
+        "container_format": "bare", 
+        "disk_format": "raw", 
+        "path": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.image", 
+    "fields": {
+        "updated": "2014-04-23T04:10:59.634Z", 
+        "name": "Ubuntu 12.04 LTS", 
+        "created": "2014-04-23T04:10:59.634Z", 
+        "container_format": "bare", 
+        "disk_format": "raw", 
+        "path": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.image", 
+    "fields": {
+        "updated": "2014-04-23T04:11:24.968Z", 
+        "name": "Hadoop 2.4.0", 
+        "created": "2014-04-23T04:11:24.968Z", 
+        "container_format": "bare", 
+        "disk_format": "raw", 
+        "path": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.image", 
+    "fields": {
+        "updated": "2014-04-23T04:11:37.141Z", 
+        "name": "MPI 1.8", 
+        "created": "2014-04-23T04:11:37.141Z", 
+        "container_format": "bare", 
+        "disk_format": "raw", 
+        "path": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 384, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 385, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 386, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node3.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 387, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node4.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 388, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node5.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 389, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node6.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 390, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node7.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 391, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node8.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 392, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node9.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 393, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node10.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 394, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node11.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 395, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node12.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 396, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node13.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 397, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node14.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 398, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node15.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 399, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node16.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 400, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node17.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 401, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node18.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 402, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node19.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 403, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node20.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 404, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node21.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 405, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node22.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 406, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node23.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 407, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node24.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 408, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node25.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 409, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node26.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 410, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node27.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 411, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node28.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 412, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node29.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 413, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node30.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 414, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node31.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 415, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node32.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 416, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 417, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node34.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 418, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node35.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 419, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node36.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 420, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node37.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 421, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node38.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 422, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node39.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 423, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node40.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 424, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node41.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 425, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node42.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 426, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node43.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 427, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node44.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 428, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node45.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 429, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node46.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 430, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node47.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 431, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 432, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node49.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 433, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node50.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 434, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node51.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 435, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node52.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 436, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node53.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 437, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node54.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 438, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node55.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 439, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node56.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 440, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node57.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 441, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node58.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 442, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node59.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 443, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node60.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 444, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node61.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 445, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node62.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 446, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node63.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 447, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node64.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 448, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node65.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 449, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node66.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 450, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node67.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 451, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node68.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 452, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node69.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 453, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node70.stanford.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 454, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 455, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 456, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node3.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 457, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node4.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 458, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node5.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 459, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node6.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 460, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node7.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 461, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node8.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 462, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node9.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 463, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node10.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 464, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node11.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 465, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node12.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 466, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node13.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 467, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node14.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 468, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node15.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 469, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node16.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 470, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node17.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 471, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node18.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 472, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node19.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 473, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node20.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 474, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node21.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 475, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node22.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 476, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node23.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 477, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node24.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 478, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node25.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 479, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node26.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 480, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node27.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 481, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node28.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 482, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node29.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 483, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node30.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 484, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node31.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 485, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node32.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 486, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 487, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node34.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 488, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node35.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 489, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node36.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 490, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node37.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 491, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node38.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 492, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node39.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 493, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node40.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 494, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node41.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 495, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node42.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 496, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node43.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 497, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node44.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 498, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node45.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 499, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node46.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 500, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node47.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 501, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 502, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node49.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 503, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node50.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 504, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node51.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 505, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node52.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 506, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node53.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 507, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node54.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 508, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node55.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 509, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node56.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 510, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node57.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 511, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node58.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 512, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node59.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 513, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node60.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 514, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node61.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 515, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node62.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 516, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node63.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 517, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node64.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 518, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node65.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 519, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node66.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 520, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node67.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 521, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node68.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 522, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node69.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 523, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node70.washington.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 524, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 525, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 526, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node3.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 527, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node4.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 528, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node5.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 529, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node6.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 530, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node7.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 531, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node8.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 532, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node9.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 533, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node10.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 534, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node11.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 535, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node12.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 536, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node13.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 537, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node14.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 538, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node15.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 539, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node16.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 540, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node17.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 541, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node18.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 542, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node19.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 543, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node20.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 544, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node21.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 545, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node22.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 546, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node23.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 547, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node24.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 548, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node25.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 549, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node26.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 550, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node27.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 551, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node28.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 552, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node29.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 553, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node30.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 554, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node31.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 555, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node32.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 556, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 557, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node34.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 558, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node35.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 559, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node36.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 560, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node37.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 561, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node38.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 562, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node39.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 563, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node40.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 564, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node41.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 565, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node42.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 566, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node43.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 567, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node44.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 568, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node45.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 569, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node46.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 570, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node47.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 571, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 572, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node49.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 573, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node50.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 574, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node51.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 575, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node52.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 576, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node53.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 577, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node54.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 578, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node55.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 579, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node56.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 580, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node57.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 581, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node58.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 582, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node59.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 583, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node60.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 584, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node61.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 585, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node62.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 586, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node63.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 587, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node64.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 588, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node65.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 589, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node66.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 590, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node67.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 591, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node68.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 592, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node69.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 593, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node70.princeton.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 594, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 595, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 596, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node3.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 597, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node4.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 598, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node5.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 599, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node6.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 600, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node7.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 601, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node8.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 602, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node9.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 603, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node10.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 604, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node11.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 605, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node12.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 606, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node13.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 607, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node14.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 608, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node15.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 609, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node16.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 610, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node17.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 611, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node18.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 612, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node19.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 613, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node20.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 614, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node21.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 615, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node22.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 616, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node23.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 617, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node24.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 618, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node25.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 619, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node26.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 620, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node27.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 621, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node28.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 622, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node29.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 623, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node30.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 624, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node31.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 625, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node32.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 626, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 627, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node34.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 628, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node35.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 629, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node36.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 630, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node37.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 631, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node38.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 632, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node39.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 633, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node40.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 634, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node41.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 635, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node42.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 636, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node43.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 637, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node44.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 638, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node45.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 639, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node46.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 640, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node47.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 641, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 642, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node49.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 643, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node50.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 644, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node51.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 645, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node52.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 646, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node53.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 647, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node54.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 648, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node55.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 649, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node56.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 650, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node57.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 651, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node58.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 652, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node59.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 653, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node60.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 654, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node61.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 655, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node62.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 656, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node63.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 657, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node64.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 658, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node65.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 659, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node66.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 660, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node67.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 661, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node68.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 662, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node69.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 663, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node70.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 664, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 665, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 666, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node3.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 667, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node4.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 668, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node5.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 669, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node6.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 670, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node7.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 671, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node8.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 672, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node9.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 673, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node10.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 674, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node11.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 675, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node12.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 676, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node13.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 677, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node14.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 678, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node15.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 679, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node16.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 680, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node17.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 681, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node18.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 682, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node19.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 683, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node20.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 684, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node21.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 685, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node22.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 686, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node23.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 687, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node24.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 688, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node25.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 689, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node26.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 690, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node27.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 691, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node28.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 692, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node29.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 693, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node30.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 694, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node31.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 695, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node32.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 696, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 697, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node34.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 698, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node35.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 699, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node36.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 700, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node37.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 701, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node38.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 702, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node39.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 703, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node40.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 704, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node41.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 705, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node42.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 706, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node43.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 707, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node44.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 708, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node45.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 709, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node46.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 710, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node47.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 711, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 712, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node49.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 713, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node50.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 714, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node51.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 715, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node52.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 716, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node53.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 717, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node54.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 718, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node55.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 719, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node56.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 720, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node57.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 721, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node58.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 722, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node59.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 723, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node60.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 724, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node61.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 725, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node62.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 726, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node63.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 727, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node64.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 728, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node65.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 729, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node66.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 730, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node67.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 731, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node68.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 732, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node69.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 733, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node70.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 734, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.atla.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 735, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.atla.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 736, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.chic.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 737, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.chic.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 738, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.hous.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 739, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.hous.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 740, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.kans.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 741, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.kans.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 742, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.losa.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 743, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.losa.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 744, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.newy.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 745, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.newy.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 746, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.salt.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 747, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.salt.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 748, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.seat.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 20, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 749, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.seat.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 20, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 750, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node1.wash.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 21, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 751, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node2.wash.internet2.vini-veritas.net", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 21, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 752, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-12-17T17:10:48.740Z", 
+        "name": "opencloud0.sing.internet2.edu", 
+        "created": "2013-12-17T17:10:48.740Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 753, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-12-17T17:10:48.742Z", 
+        "name": "opencloud1.sing.internet2.edu", 
+        "created": "2013-12-17T17:10:48.741Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 754, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-12-17T17:10:48.742Z", 
+        "name": "opencloud2.sing.internet2.edu", 
+        "created": "2013-12-17T17:10:48.742Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 755, 
+    "model": "core.node", 
+    "fields": {
+        "updated": "2013-12-17T17:10:48.743Z", 
+        "name": "opencloud3.sing.internet2.edu", 
+        "created": "2013-12-17T17:10:48.743Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.serviceresource", 
+    "fields": {
+        "updated": "2013-12-11T22:18:00.040Z", 
+        "name": "Cycles", 
+        "bucketMaxSize": 0, 
+        "created": "2013-12-11T22:18:00.040Z", 
+        "serviceClass": 1, 
+        "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
+        "bucketInRate": 0, 
+        "cost": 7, 
+        "maxUnitsNode": 0, 
+        "maxDuration": 0, 
+        "enacted": null
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.serviceresource", 
+    "fields": {
+        "updated": "2013-12-11T22:18:00.045Z", 
+        "name": "Cycles", 
+        "bucketMaxSize": 0, 
+        "created": "2013-12-11T22:18:00.045Z", 
+        "serviceClass": 2, 
+        "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
+        "bucketInRate": 0, 
+        "cost": 7, 
+        "maxUnitsNode": 0, 
+        "maxDuration": 0, 
+        "enacted": null
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.serviceresource", 
+    "fields": {
+        "updated": "2013-12-11T22:18:00.053Z", 
+        "name": "Cycles", 
+        "bucketMaxSize": 0, 
+        "created": "2013-12-11T22:18:00.053Z", 
+        "serviceClass": 3, 
+        "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
+        "bucketInRate": 0, 
+        "cost": 7, 
+        "maxUnitsNode": 0, 
+        "maxDuration": 0, 
+        "enacted": null
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.serviceresource", 
+    "fields": {
+        "updated": "2013-12-11T22:18:00.064Z", 
+        "name": "numberCores", 
+        "bucketMaxSize": 0, 
+        "created": "2013-12-11T22:18:00.064Z", 
+        "serviceClass": 3, 
+        "maxUnitsDeployment": 210, 
+        "calendarReservable": true, 
+        "bucketInRate": 0, 
+        "cost": 0, 
+        "maxUnitsNode": 6, 
+        "maxDuration": 8760, 
+        "enacted": null
+    }
+},
+{
+    "pk": 8, 
+    "model": "core.serviceresource", 
+    "fields": {
+        "updated": "2013-12-11T22:18:00.072Z", 
+        "name": "numberCores", 
+        "bucketMaxSize": 210, 
+        "created": "2013-12-11T22:18:00.072Z", 
+        "serviceClass": 2, 
+        "maxUnitsDeployment": 210, 
+        "calendarReservable": true, 
+        "bucketInRate": 10, 
+        "cost": 7, 
+        "maxUnitsNode": 6, 
+        "maxDuration": 168, 
+        "enacted": null
+    }
+},
+{
+    "pk": 40, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 613, 
+        "instance_name": "instance-000003e8", 
+        "updated": "2013-12-12T17:55:32.455Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node20.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.455Z", 
+        "ip": "130.207.98.29", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 41, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 615, 
+        "instance_name": "instance-000003e9", 
+        "updated": "2013-12-12T17:55:32.478Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node22.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.478Z", 
+        "ip": "130.207.98.31", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 42, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 617, 
+        "instance_name": "instance-000003ea", 
+        "updated": "2013-12-12T17:55:32.495Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node24.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.495Z", 
+        "ip": "130.207.98.33", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 43, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 622, 
+        "instance_name": "instance-000003eb", 
+        "updated": "2013-12-12T17:55:32.512Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node29.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.511Z", 
+        "ip": "130.207.98.38", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 44, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 623, 
+        "instance_name": "instance-000003ec", 
+        "updated": "2013-12-12T17:55:32.528Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node30.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.528Z", 
+        "ip": "130.207.98.39", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 45, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 624, 
+        "instance_name": "instance-000003ed", 
+        "updated": "2013-12-12T17:55:32.544Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node31.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.544Z", 
+        "ip": "130.207.98.40", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 46, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 625, 
+        "instance_name": "instance-000003ee", 
+        "updated": "2013-12-12T17:55:32.561Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node32.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.561Z", 
+        "ip": "130.207.98.41", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 47, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 630, 
+        "instance_name": "instance-000003ef", 
+        "updated": "2013-12-12T17:55:32.577Z", 
+        "slice": 4, 
+        "deploymentNetwork": 8, 
+        "name": "node37.gt.vicci.org", 
+        "created": "2013-12-12T17:55:32.577Z", 
+        "ip": "130.207.98.46", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 48, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 666, 
+        "instance_name": "instance-000003f0", 
+        "updated": "2013-12-12T17:55:32.594Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node3.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.594Z", 
+        "ip": "141.39.220.13", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 49, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 683, 
+        "instance_name": "instance-000003f1", 
+        "updated": "2013-12-12T17:55:32.611Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node20.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.610Z", 
+        "ip": "141.39.220.30", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 50, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 684, 
+        "instance_name": "instance-000003f2", 
+        "updated": "2013-12-12T17:55:32.627Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node21.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.627Z", 
+        "ip": "141.39.220.31", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 51, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 686, 
+        "instance_name": "instance-000003f3", 
+        "updated": "2013-12-12T17:55:32.644Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node23.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.644Z", 
+        "ip": "141.39.220.33", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 52, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 687, 
+        "instance_name": "instance-000003f4", 
+        "updated": "2013-12-12T17:55:32.660Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node24.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.660Z", 
+        "ip": "141.39.220.34", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 53, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 691, 
+        "instance_name": "instance-000003f5", 
+        "updated": "2013-12-12T17:55:32.677Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node28.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.677Z", 
+        "ip": "141.39.220.38", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 54, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 693, 
+        "instance_name": "instance-000003f6", 
+        "updated": "2013-12-12T17:55:32.693Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node30.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.693Z", 
+        "ip": "141.39.220.40", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 55, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 694, 
+        "instance_name": "instance-000003f7", 
+        "updated": "2013-12-12T17:55:32.710Z", 
+        "slice": 4, 
+        "deploymentNetwork": 9, 
+        "name": "node31.mpisws.vicci.org", 
+        "created": "2013-12-12T17:55:32.710Z", 
+        "ip": "141.39.220.41", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 56, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 559, 
+        "instance_name": "instance-000003f8", 
+        "updated": "2013-12-12T17:55:32.726Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node36.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.726Z", 
+        "ip": "128.112.171.90", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 57, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 560, 
+        "instance_name": "instance-000003f9", 
+        "updated": "2013-12-12T17:55:32.743Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node37.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.743Z", 
+        "ip": "128.112.171.92", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 58, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 561, 
+        "instance_name": "instance-000003fa", 
+        "updated": "2013-12-12T17:55:32.760Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node38.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.759Z", 
+        "ip": "128.112.171.94", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 59, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 562, 
+        "instance_name": "instance-000003fb", 
+        "updated": "2013-12-12T17:55:32.776Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node39.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.776Z", 
+        "ip": "128.112.171.96", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 60, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 563, 
+        "instance_name": "instance-000003fc", 
+        "updated": "2013-12-12T17:55:32.792Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node40.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.792Z", 
+        "ip": "128.112.171.98", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 61, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 565, 
+        "instance_name": "instance-000003fd", 
+        "updated": "2013-12-12T17:55:32.809Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node42.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.809Z", 
+        "ip": "128.112.171.102", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 62, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 566, 
+        "instance_name": "instance-000003fe", 
+        "updated": "2013-12-12T17:55:32.826Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node43.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.826Z", 
+        "ip": "128.112.171.104", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 63, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 568, 
+        "instance_name": "instance-000003ff", 
+        "updated": "2013-12-12T17:55:32.842Z", 
+        "slice": 4, 
+        "deploymentNetwork": 7, 
+        "name": "node45.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:32.842Z", 
+        "ip": "128.112.171.108", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 64, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 404, 
+        "instance_name": "instance-00000400", 
+        "updated": "2013-12-12T17:55:32.859Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node21.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.859Z", 
+        "ip": "171.67.92.159", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 65, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 405, 
+        "instance_name": "instance-00000401", 
+        "updated": "2013-12-12T17:55:32.875Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node22.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.875Z", 
+        "ip": "171.67.92.160", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 66, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 406, 
+        "instance_name": "instance-00000402", 
+        "updated": "2013-12-12T17:55:32.892Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node23.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.892Z", 
+        "ip": "171.67.92.161", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 67, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 407, 
+        "instance_name": "instance-00000403", 
+        "updated": "2013-12-12T17:55:32.909Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node24.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.909Z", 
+        "ip": "171.67.92.162", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 68, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 408, 
+        "instance_name": "instance-00000404", 
+        "updated": "2013-12-12T17:55:32.925Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node25.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.925Z", 
+        "ip": "171.67.92.163", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 69, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 409, 
+        "instance_name": "instance-00000405", 
+        "updated": "2013-12-12T17:55:32.942Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node26.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.942Z", 
+        "ip": "171.67.92.164", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 70, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 412, 
+        "instance_name": "instance-00000406", 
+        "updated": "2013-12-12T17:55:32.958Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node29.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.958Z", 
+        "ip": "171.67.92.167", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 71, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 413, 
+        "instance_name": "instance-00000407", 
+        "updated": "2013-12-12T17:55:32.975Z", 
+        "slice": 4, 
+        "deploymentNetwork": 5, 
+        "name": "node30.stanford.vicci.org", 
+        "created": "2013-12-12T17:55:32.975Z", 
+        "ip": "171.67.92.168", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 72, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 460, 
+        "instance_name": "instance-00000408", 
+        "updated": "2013-12-12T17:55:32.992Z", 
+        "slice": 4, 
+        "deploymentNetwork": 6, 
+        "name": "node7.washington.vicci.org", 
+        "created": "2013-12-12T17:55:32.992Z", 
+        "ip": "128.95.1.112", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 73, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 467, 
+        "instance_name": "instance-00000409", 
+        "updated": "2013-12-12T17:55:33.008Z", 
+        "slice": 4, 
+        "deploymentNetwork": 6, 
+        "name": "node14.washington.vicci.org", 
+        "created": "2013-12-12T17:55:33.008Z", 
+        "ip": "128.95.1.119", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 74, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 468, 
+        "instance_name": "instance-0000040a", 
+        "updated": "2013-12-12T17:55:33.025Z", 
+        "slice": 4, 
+        "deploymentNetwork": 6, 
+        "name": "node15.washington.vicci.org", 
+        "created": "2013-12-12T17:55:33.025Z", 
+        "ip": "128.95.1.120", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 75, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 469, 
+        "instance_name": "instance-0000040b", 
+        "updated": "2013-12-12T17:55:33.041Z", 
+        "slice": 4, 
+        "deploymentNetwork": 6, 
+        "name": "node16.washington.vicci.org", 
+        "created": "2013-12-12T17:55:33.041Z", 
+        "ip": "128.95.1.121", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 76, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 470, 
+        "instance_name": "instance-0000040c", 
+        "updated": "2013-12-12T17:55:33.058Z", 
+        "slice": 4, 
+        "deploymentNetwork": 6, 
+        "name": "node17.washington.vicci.org", 
+        "created": "2013-12-12T17:55:33.058Z", 
+        "ip": "128.95.1.122", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 77, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 553, 
+        "instance_name": "instance-0000040d", 
+        "updated": "2013-12-12T17:55:33.110Z", 
+        "slice": 8, 
+        "deploymentNetwork": 7, 
+        "name": "node30.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:33.110Z", 
+        "ip": "128.112.171.78", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 78, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 553, 
+        "instance_name": "instance-0000040e", 
+        "updated": "2013-12-12T17:55:33.142Z", 
+        "slice": 9, 
+        "deploymentNetwork": 7, 
+        "name": "node30.princeton.vicci.org", 
+        "created": "2013-12-12T17:55:33.142Z", 
+        "ip": "128.112.171.78", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 79, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 469, 
+        "instance_name": null, 
+        "updated": "2013-12-13T21:51:36.927Z", 
+        "slice": 11, 
+        "deploymentNetwork": 6, 
+        "name": "Stork", 
+        "created": "2013-12-13T21:51:36.927Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 80, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 438, 
+        "instance_name": null, 
+        "updated": "2013-12-13T21:53:35.001Z", 
+        "slice": 12, 
+        "deploymentNetwork": 5, 
+        "name": "Owl", 
+        "created": "2013-12-13T21:53:35.001Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 81, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 588, 
+        "instance_name": null, 
+        "updated": "2013-12-18T22:21:36.513Z", 
+        "slice": 14, 
+        "deploymentNetwork": 7, 
+        "name": "test-slice-1", 
+        "created": "2013-12-13T21:58:13.897Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 82, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 589, 
+        "instance_name": null, 
+        "updated": "2013-12-18T22:21:36.522Z", 
+        "slice": 14, 
+        "deploymentNetwork": 7, 
+        "name": "test-slice-1", 
+        "created": "2013-12-13T21:58:44.349Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 83, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 590, 
+        "instance_name": null, 
+        "updated": "2013-12-18T22:21:36.530Z", 
+        "slice": 14, 
+        "deploymentNetwork": 7, 
+        "name": "test-slice-1", 
+        "created": "2013-12-13T21:58:44.350Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 84, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 384, 
+        "instance_name": null, 
+        "updated": "2013-12-13T21:59:36.723Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "Hadoop", 
+        "created": "2013-12-13T21:59:36.723Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 85, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 473, 
+        "instance_name": null, 
+        "updated": "2013-12-13T21:59:36.725Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "Hadoop", 
+        "created": "2013-12-13T21:59:36.725Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 86, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 535, 
+        "instance_name": null, 
+        "updated": "2013-12-13T21:59:36.726Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "Hadoop", 
+        "created": "2013-12-13T21:59:36.726Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 87, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 592, 
+        "instance_name": null, 
+        "updated": "2013-12-18T22:22:04.726Z", 
+        "slice": 15, 
+        "deploymentNetwork": 7, 
+        "name": "test-slice-2", 
+        "created": "2013-12-13T22:01:30.192Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 88, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 593, 
+        "instance_name": null, 
+        "updated": "2013-12-18T22:22:04.734Z", 
+        "slice": 15, 
+        "deploymentNetwork": 7, 
+        "name": "test-slice-2", 
+        "created": "2013-12-13T22:01:49.742Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 288, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 433, 
+        "instance_name": "instance-000005dc", 
+        "updated": "2013-12-18T21:41:49.275Z", 
+        "slice": 6, 
+        "deploymentNetwork": 5, 
+        "name": "node50.stanford.vicci.org", 
+        "created": "2013-12-18T21:41:49.275Z", 
+        "ip": "171.67.92.188", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 289, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 643, 
+        "instance_name": "instance-000005dd", 
+        "updated": "2013-12-18T21:41:49.293Z", 
+        "slice": 6, 
+        "deploymentNetwork": 8, 
+        "name": "node50.gt.vicci.org", 
+        "created": "2013-12-18T21:41:49.293Z", 
+        "ip": "130.207.98.59", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 290, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 713, 
+        "instance_name": "instance-000005de", 
+        "updated": "2013-12-18T21:41:49.310Z", 
+        "slice": 6, 
+        "deploymentNetwork": 9, 
+        "name": "node50.mpisws.vicci.org", 
+        "created": "2013-12-18T21:41:49.310Z", 
+        "ip": "141.39.220.60", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 291, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 503, 
+        "instance_name": "instance-000005df", 
+        "updated": "2013-12-18T21:41:49.326Z", 
+        "slice": 6, 
+        "deploymentNetwork": 6, 
+        "name": "node50.washington.vicci.org", 
+        "created": "2013-12-18T21:41:49.326Z", 
+        "ip": "128.95.1.155", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 292, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 513, 
+        "instance_name": "instance-000005e0", 
+        "updated": "2013-12-18T21:41:49.343Z", 
+        "slice": 6, 
+        "deploymentNetwork": 6, 
+        "name": "node60.washington.vicci.org", 
+        "created": "2013-12-18T21:41:49.343Z", 
+        "ip": "128.95.1.165", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 293, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 723, 
+        "instance_name": "instance-000005e1", 
+        "updated": "2013-12-18T21:41:49.359Z", 
+        "slice": 6, 
+        "deploymentNetwork": 9, 
+        "name": "node60.mpisws.vicci.org", 
+        "created": "2013-12-18T21:41:49.359Z", 
+        "ip": "141.39.220.70", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 294, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 603, 
+        "instance_name": "instance-000005e2", 
+        "updated": "2013-12-18T21:41:49.376Z", 
+        "slice": 6, 
+        "deploymentNetwork": 8, 
+        "name": "node10.gt.vicci.org", 
+        "created": "2013-12-18T21:41:49.376Z", 
+        "ip": "130.207.98.19", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 295, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 559, 
+        "instance_name": "instance-000005e3", 
+        "updated": "2013-12-18T21:41:49.393Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node36.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.393Z", 
+        "ip": "128.112.171.90", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 296, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 560, 
+        "instance_name": "instance-000005e4", 
+        "updated": "2013-12-18T21:41:49.409Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node37.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.409Z", 
+        "ip": "128.112.171.92", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 297, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 561, 
+        "instance_name": "instance-000005e5", 
+        "updated": "2013-12-18T21:41:49.426Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node38.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.426Z", 
+        "ip": "128.112.171.94", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 298, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 562, 
+        "instance_name": "instance-000005e6", 
+        "updated": "2013-12-18T21:41:49.442Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node39.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.442Z", 
+        "ip": "128.112.171.96", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 299, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 563, 
+        "instance_name": "instance-000005e7", 
+        "updated": "2013-12-18T21:41:49.459Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node40.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.459Z", 
+        "ip": "128.112.171.98", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 300, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 564, 
+        "instance_name": "instance-000005e8", 
+        "updated": "2013-12-18T21:41:49.476Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node41.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.475Z", 
+        "ip": "128.112.171.100", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 301, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 565, 
+        "instance_name": "instance-000005e9", 
+        "updated": "2013-12-18T21:41:49.492Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node42.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.492Z", 
+        "ip": "128.112.171.102", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 302, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 566, 
+        "instance_name": "instance-000005ea", 
+        "updated": "2013-12-18T21:41:49.508Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node43.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.508Z", 
+        "ip": "128.112.171.104", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 303, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 567, 
+        "instance_name": "instance-000005eb", 
+        "updated": "2013-12-18T21:41:49.525Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node44.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.525Z", 
+        "ip": "128.112.171.106", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 304, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 568, 
+        "instance_name": "instance-000005ec", 
+        "updated": "2013-12-18T21:41:49.542Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node45.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.542Z", 
+        "ip": "128.112.171.108", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 305, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 569, 
+        "instance_name": "instance-000005ed", 
+        "updated": "2013-12-18T21:41:49.558Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node46.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.558Z", 
+        "ip": "128.112.171.110", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 306, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 570, 
+        "instance_name": "instance-000005ee", 
+        "updated": "2013-12-18T21:41:49.575Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node47.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.575Z", 
+        "ip": "128.112.171.112", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 307, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 571, 
+        "instance_name": "instance-000005ef", 
+        "updated": "2013-12-18T21:41:49.591Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node48.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.591Z", 
+        "ip": "128.112.171.114", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 308, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 572, 
+        "instance_name": "instance-000005f0", 
+        "updated": "2013-12-18T21:41:49.608Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node49.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.608Z", 
+        "ip": "128.112.171.116", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 309, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 573, 
+        "instance_name": "instance-000005f1", 
+        "updated": "2013-12-18T21:41:49.625Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node50.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.625Z", 
+        "ip": "128.112.171.118", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 310, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 574, 
+        "instance_name": "instance-000005f2", 
+        "updated": "2013-12-18T21:41:49.641Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node51.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.641Z", 
+        "ip": "128.112.171.120", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 311, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 575, 
+        "instance_name": "instance-000005f3", 
+        "updated": "2013-12-18T21:41:49.658Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node52.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.658Z", 
+        "ip": "128.112.171.122", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 312, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 576, 
+        "instance_name": "instance-000005f4", 
+        "updated": "2013-12-18T21:41:49.674Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node53.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.674Z", 
+        "ip": "128.112.171.124", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 313, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 577, 
+        "instance_name": "instance-000005f5", 
+        "updated": "2013-12-18T21:41:49.691Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node54.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.691Z", 
+        "ip": "128.112.171.126", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 314, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 578, 
+        "instance_name": "instance-000005f6", 
+        "updated": "2013-12-18T21:41:49.707Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node55.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.707Z", 
+        "ip": "128.112.171.128", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 315, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 579, 
+        "instance_name": "instance-000005f7", 
+        "updated": "2013-12-18T21:41:49.724Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node56.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.724Z", 
+        "ip": "128.112.171.130", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 316, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 580, 
+        "instance_name": "instance-000005f8", 
+        "updated": "2013-12-18T21:41:49.741Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node57.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.740Z", 
+        "ip": "128.112.171.132", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 317, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 581, 
+        "instance_name": "instance-000005f9", 
+        "updated": "2013-12-18T21:41:49.757Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node58.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.757Z", 
+        "ip": "128.112.171.134", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 318, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 582, 
+        "instance_name": "instance-000005fa", 
+        "updated": "2013-12-18T21:41:49.774Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node59.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.774Z", 
+        "ip": "128.112.171.136", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 319, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 583, 
+        "instance_name": "instance-000005fb", 
+        "updated": "2013-12-18T21:41:49.790Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node60.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.790Z", 
+        "ip": "128.112.171.138", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 320, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 584, 
+        "instance_name": "instance-000005fc", 
+        "updated": "2013-12-18T21:41:49.807Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node61.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.807Z", 
+        "ip": "128.112.171.140", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 321, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 585, 
+        "instance_name": "instance-000005fd", 
+        "updated": "2013-12-18T21:41:49.823Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node62.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.823Z", 
+        "ip": "128.112.171.142", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 322, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 586, 
+        "instance_name": "instance-000005fe", 
+        "updated": "2013-12-18T21:41:49.840Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node63.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.840Z", 
+        "ip": "128.112.171.144", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 323, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 587, 
+        "instance_name": "instance-000005ff", 
+        "updated": "2013-12-18T21:41:49.856Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node64.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.856Z", 
+        "ip": "128.112.171.146", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 324, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 588, 
+        "instance_name": "instance-00000600", 
+        "updated": "2013-12-18T21:41:49.873Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node65.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.873Z", 
+        "ip": "128.112.171.148", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
+    }
+},
+{
+    "pk": 325, 
+    "model": "core.sliver", 
+    "fields": {
+        "node": 589, 
+        "instance_name": "instance-00000601", 
+        "updated": "2013-12-18T21:41:49.890Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node66.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.890Z", 
+        "ip": "128.112.171.150", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 4
-    "model": "core.slice", 
+    "pk": 326
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-05T01:41:11.410Z", 
-        "name": "HyperCache", 
-        "service": 3, 
-        "created": "2013-04-03T23:14:11.072Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": 1, 
-        "description": "HyperCache slice for HyperCache service."
+        "node": 590, 
+        "instance_name": "instance-00000602", 
+        "updated": "2013-12-18T21:41:49.906Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node67.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.906Z", 
+        "ip": "128.112.171.152", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 6
-    "model": "core.slice", 
+    "pk": 327
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-05T01:41:23.032Z", 
-        "name": "Syndicate", 
-        "service": 5, 
-        "created": "2013-04-03T23:14:11.072Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": 1, 
-        "description": ""
+        "node": 591, 
+        "instance_name": "instance-00000603", 
+        "updated": "2013-12-18T21:41:49.923Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node68.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.923Z", 
+        "ip": "128.112.171.154", 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 8, 
-    "model": "core.slice", 
+    "pk": 328, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-12T18:11:27.780Z", 
-        "name": "DnsRedir", 
-        "service": 4, 
-        "created": "2013-12-04T22:48:35.584Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 2, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
+        "node": 592, 
+        "instance_name": "instance-00000604", 
+        "updated": "2013-12-18T21:41:49.939Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node69.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.939Z", 
+        "ip": "128.112.171.156", 
+        "image": 1, 
         "creator": 8, 
-        "description": "DNS Redirection slice for RequestRouter service."
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 9, 
-    "model": "core.slice", 
+    "pk": 329, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-12T18:12:41.375Z", 
-        "name": "DnsDemux", 
-        "service": 4, 
-        "created": "2013-12-04T22:49:23.051Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 2, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
+        "node": 593, 
+        "instance_name": "instance-00000605", 
+        "updated": "2013-12-18T21:41:49.956Z", 
+        "slice": 6, 
+        "deploymentNetwork": 7, 
+        "name": "node70.princeton.vicci.org", 
+        "created": "2013-12-18T21:41:49.956Z", 
+        "ip": "128.112.171.158", 
+        "image": 1, 
         "creator": 8, 
-        "description": "DNS Demultiplexing slice for RequestRouter service. "
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 10, 
-    "model": "core.slice", 
+    "pk": 330, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-09T14:19:28.458Z", 
-        "name": "Infrastructure", 
-        "service": null, 
-        "created": "2013-12-09T14:13:15.392Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": ""
+        "node": 453, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:07.852Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "node70.stanford.vicci.org", 
+        "created": "2014-05-20T16:19:07.852Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 11, 
-    "model": "core.slice", 
+    "pk": 331, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-17T18:09:29.065Z", 
-        "name": "Stork", 
-        "service": 8, 
-        "created": "2013-12-13T21:49:59.476Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 24, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": "The Stork Package Management Service"
+        "node": 523, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:07.940Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "node70.washington.vicci.org", 
+        "created": "2014-05-20T16:19:07.940Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 12, 
-    "model": "core.slice", 
+    "pk": 332, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-17T18:09:20.587Z", 
-        "name": "Owl", 
-        "service": 8, 
-        "created": "2013-12-13T21:52:15.590Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 24, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": "The Owl Data Collection service"
+        "node": 452, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.011Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "node69.stanford.vicci.org", 
+        "created": "2014-05-20T16:19:08.011Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 13, 
-    "model": "core.slice", 
+    "pk": 333, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-13T21:59:36.718Z", 
-        "name": "Hadoop", 
-        "service": null, 
-        "created": "2013-12-13T21:54:20.895Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 2, 
-        "enabled": true, 
-        "site": 22, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": "Hadoop map-reduce service"
+        "node": 522, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.076Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "node69.washington.vicci.org", 
+        "created": "2014-05-20T16:19:08.076Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 14, 
-    "model": "core.slice", 
+    "pk": 334, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-13T21:58:44.338Z", 
-        "name": "test-slice-1", 
-        "service": null, 
-        "created": "2013-12-13T21:56:57.299Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 10, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": "Test slice number one."
+        "node": 451, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.160Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "node68.stanford.vicci.org", 
+        "created": "2014-05-20T16:19:08.159Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 15, 
-    "model": "core.slice", 
+    "pk": 335, 
+    "model": "core.sliver", 
     "fields": {
-        "router_id": null, 
-        "updated": "2013-12-13T22:01:49.732Z", 
-        "name": "test-slice-2", 
-        "service": null, 
-        "created": "2013-12-13T22:00:03.049Z", 
-        "network_id": null, 
-        "tenant_id": "", 
-        "serviceClass": 1, 
-        "enabled": true, 
-        "site": 10, 
-        "omf_friendly": false, 
-        "subnet_id": null, 
-        "slice_url": "", 
-        "creator": null, 
-        "description": "test slice number two."
+        "node": 521, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.244Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "node68.washington.vicci.org", 
+        "created": "2014-05-20T16:19:08.244Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 1
-    "model": "core.image", 
+    "pk": 336
+    "model": "core.sliver", 
     "fields": {
-        "updated": "2013-12-09T14:26:56.787Z", 
-        "name": "Fedora 16 LXC rev 1.3", 
-        "created": "2013-12-09T14:26:56.787Z", 
-        "container_format": "bare", 
-        "disk_format": "raw", 
-        "image_id": "d4bdbba2-6883-4232-863a-202fd4c56c21"
+        "node": 450, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.305Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "node67.stanford.vicci.org", 
+        "created": "2014-05-20T16:19:08.305Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 384
-    "model": "core.node", 
+    "pk": 337
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node1.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 593, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.403Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "node70.princeton.vicci.org", 
+        "created": "2014-05-20T16:19:08.397Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 385
-    "model": "core.node", 
+    "pk": 338
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node2.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 520, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.421Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "node67.washington.vicci.org", 
+        "created": "2014-05-20T16:19:08.421Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 386
-    "model": "core.node", 
+    "pk": 339
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node3.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 449, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.465Z", 
+        "slice": 13, 
+        "deploymentNetwork": 5, 
+        "name": "node66.stanford.vicci.org", 
+        "created": "2014-05-20T16:19:08.465Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 387
-    "model": "core.node", 
+    "pk": 340
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node4.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 592, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.555Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "node69.princeton.vicci.org", 
+        "created": "2014-05-20T16:19:08.555Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 388
-    "model": "core.node", 
+    "pk": 341
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node5.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 519, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.567Z", 
+        "slice": 13, 
+        "deploymentNetwork": 6, 
+        "name": "node66.washington.vicci.org", 
+        "created": "2014-05-20T16:19:08.567Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 389
-    "model": "core.node", 
+    "pk": 342
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node6.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 591, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.788Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "node68.princeton.vicci.org", 
+        "created": "2014-05-20T16:19:08.788Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 390
-    "model": "core.node", 
+    "pk": 343
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node7.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 590, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.903Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "node67.princeton.vicci.org", 
+        "created": "2014-05-20T16:19:08.903Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 391
-    "model": "core.node", 
+    "pk": 344
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node8.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 589, 
+        "instance_name": null, 
+        "updated": "2014-05-20T16:19:08.995Z", 
+        "slice": 13, 
+        "deploymentNetwork": 7, 
+        "name": "node66.princeton.vicci.org", 
+        "created": "2014-05-20T16:19:08.995Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 392
-    "model": "core.node", 
+    "pk": 345
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node9.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 535, 
+        "instance_name": null, 
+        "updated": "2014-05-20T17:55:00.654Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "Analytics", 
+        "created": "2014-05-20T17:55:00.654Z", 
+        "ip": null, 
+        "image": 1, 
+        "creator": 8, 
+        "numberCores": 0, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 393
-    "model": "core.node", 
+    "pk": 346
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node10.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 384, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.304Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node1.stanford.vicci.org", 
+        "created": "2014-05-20T23:45:35.304Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 394
-    "model": "core.node", 
+    "pk": 347
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node11.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 454, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.322Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node1.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.322Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 395
-    "model": "core.node", 
+    "pk": 348
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node12.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 385, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.397Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node2.stanford.vicci.org", 
+        "created": "2014-05-20T23:45:35.397Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 396
-    "model": "core.node", 
+    "pk": 349
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node13.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 455, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.436Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node2.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.436Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 397
-    "model": "core.node", 
+    "pk": 350
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node14.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 524, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.461Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "node1.princeton.vicci.org", 
+        "created": "2014-05-20T23:45:35.461Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 398
-    "model": "core.node", 
+    "pk": 351
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node15.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 386, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.472Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node3.stanford.vicci.org", 
+        "created": "2014-05-20T23:45:35.472Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 399
-    "model": "core.node", 
+    "pk": 352
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node16.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 456, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.508Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node3.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.508Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 400
-    "model": "core.node", 
+    "pk": 353
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node17.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 525, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.565Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "node2.princeton.vicci.org", 
+        "created": "2014-05-20T23:45:35.565Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 401
-    "model": "core.node", 
+    "pk": 354
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node18.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 457, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.707Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node4.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.706Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 402
-    "model": "core.node", 
+    "pk": 355
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node19.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 526, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.812Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "node3.princeton.vicci.org", 
+        "created": "2014-05-20T23:45:35.812Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 403
-    "model": "core.node", 
+    "pk": 356
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node20.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 458, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.860Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node5.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.860Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 404
-    "model": "core.node", 
+    "pk": 357
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node21.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 527, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.887Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "node4.princeton.vicci.org", 
+        "created": "2014-05-20T23:45:35.887Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 405
-    "model": "core.node", 
+    "pk": 358
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node22.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 459, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.926Z", 
+        "slice": 16, 
+        "deploymentNetwork": 6, 
+        "name": "node6.washington.vicci.org", 
+        "created": "2014-05-20T23:45:35.926Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 406
-    "model": "core.node", 
+    "pk": 359
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node23.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 528, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:45:35.961Z", 
+        "slice": 16, 
+        "deploymentNetwork": 7, 
+        "name": "node5.princeton.vicci.org", 
+        "created": "2014-05-20T23:45:35.961Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 407
-    "model": "core.node", 
+    "pk": 360
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node24.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 387, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:46:01.919Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node4.stanford.vicci.org", 
+        "created": "2014-05-20T23:46:01.919Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 408
-    "model": "core.node", 
+    "pk": 361
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node25.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 388, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:46:01.987Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node5.stanford.vicci.org", 
+        "created": "2014-05-20T23:46:01.987Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 409
-    "model": "core.node", 
+    "pk": 362
+    "model": "core.sliver", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node26.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "node": 389, 
+        "instance_name": null, 
+        "updated": "2014-05-20T23:46:02.054Z", 
+        "slice": 16, 
+        "deploymentNetwork": 5, 
+        "name": "node6.stanford.vicci.org", 
+        "created": "2014-05-20T23:46:02.054Z", 
+        "ip": null, 
+        "image": 2, 
+        "creator": 7, 
+        "numberCores": 1, 
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
-    "pk": 410
-    "model": "core.node", 
+    "pk": 1
+    "model": "core.reservation", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node27.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T23:32:41.619Z", 
+        "slice": 9, 
+        "created": "2013-12-18T23:32:07.665Z", 
+        "startTime": "2013-12-20T20:31:42Z", 
+        "duration": 48, 
+        "enacted": null
     }
 },
 {
-    "pk": 411
-    "model": "core.node", 
+    "pk": 2
+    "model": "core.reservation", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node28.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T23:34:02.148Z", 
+        "slice": 8, 
+        "created": "2013-12-18T23:33:27.591Z", 
+        "startTime": "2013-12-20T20:33:23Z", 
+        "duration": 48, 
+        "enacted": null
     }
 },
 {
-    "pk": 412
-    "model": "core.node", 
+    "pk": 3
+    "model": "core.reservation", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node29.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T23:35:45.483Z", 
+        "slice": 13, 
+        "created": "2013-12-18T23:34:55.406Z", 
+        "startTime": "2013-12-20T20:34:32Z", 
+        "duration": 24, 
+        "enacted": null
     }
 },
 {
-    "pk": 413
-    "model": "core.node", 
+    "pk": 4, 
+    "model": "core.reservation", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node30.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T23:35:25.727Z", 
+        "slice": 13, 
+        "created": "2013-12-18T23:34:55.407Z", 
+        "startTime": "2013-12-23T20:34:49Z", 
+        "duration": 24, 
+        "enacted": null
     }
 },
 {
-    "pk": 414, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node31.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 1, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:32:41.622Z", 
+        "resource": 8, 
+        "quantity": 5, 
+        "created": "2013-12-18T23:32:41.622Z", 
+        "reservationSet": 1, 
+        "sliver": 78, 
+        "enacted": null
     }
 },
 {
-    "pk": 415, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node32.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 2, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:34:02.152Z", 
+        "resource": 8, 
+        "quantity": 5, 
+        "created": "2013-12-18T23:34:02.152Z", 
+        "reservationSet": 2, 
+        "sliver": 77, 
+        "enacted": null
     }
 },
 {
-    "pk": 416, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node33.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 3, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:25.731Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:25.731Z", 
+        "reservationSet": 4, 
+        "sliver": 84, 
+        "enacted": null
     }
 },
 {
-    "pk": 417, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node34.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 4, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:25.732Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:25.732Z", 
+        "reservationSet": 4, 
+        "sliver": 85, 
+        "enacted": null
     }
 },
 {
-    "pk": 418, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node35.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 5, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:25.733Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:25.733Z", 
+        "reservationSet": 4, 
+        "sliver": 86, 
+        "enacted": null
     }
 },
 {
-    "pk": 419, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node36.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 6, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:45.486Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:45.486Z", 
+        "reservationSet": 3, 
+        "sliver": 84, 
+        "enacted": null
     }
 },
 {
-    "pk": 420, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node37.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 7, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:45.488Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:45.487Z", 
+        "reservationSet": 3, 
+        "sliver": 85, 
+        "enacted": null
     }
 },
 {
-    "pk": 421, 
-    "model": "core.node", 
+    "pk": 8, 
+    "model": "core.reservedresource", 
+    "fields": {
+        "updated": "2013-12-18T23:35:45.488Z", 
+        "resource": 8, 
+        "quantity": 1, 
+        "created": "2013-12-18T23:35:45.488Z", 
+        "reservationSet": 3, 
+        "sliver": 86, 
+        "enacted": null
+    }
+},
+{
+    "pk": 1, 
+    "model": "core.networktemplate", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node38.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "guaranteedBandwidth": 0, 
+        "description": "Connect a sliver to the public network using dedicated public IPv4 address", 
+        "created": "2013-12-09T14:15:16.899Z", 
+        "sharedNetworkName": "ext-net", 
+        "updated": "2014-05-12T19:23:35.239Z", 
+        "visibility": "public", 
+        "name": "Public dedicated IPv4", 
+        "translation": "none", 
+        "sharedNetworkId": "", 
+        "enacted": "2014-05-12T19:24:09Z"
     }
 },
 {
-    "pk": 422
-    "model": "core.node", 
+    "pk": 3
+    "model": "core.networktemplate", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node39.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "guaranteedBandwidth": 0, 
+        "description": "Connect a sliver to the public network via NAT, with port forwarding", 
+        "created": "2013-12-09T14:17:29.551Z", 
+        "sharedNetworkName": "nat-net", 
+        "updated": "2014-05-12T19:22:45.473Z", 
+        "visibility": "private", 
+        "name": "Public shared IPv4", 
+        "translation": "NAT", 
+        "sharedNetworkId": "51d641ba-9e1e-46f5-8069-bf4a929f851f", 
+        "enacted": "2014-05-12T19:23:54Z"
     }
 },
 {
-    "pk": 423
-    "model": "core.node", 
+    "pk": 4, 
+    "model": "core.networktemplate", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node40.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "guaranteedBandwidth": 0, 
+        "description": "A private virtual network", 
+        "created": "2013-12-09T14:18:02.336Z", 
+        "sharedNetworkName": "", 
+        "updated": "2014-05-12T19:22:24.929Z", 
+        "visibility": "private", 
+        "name": "Private", 
+        "translation": "none", 
+        "sharedNetworkId": "", 
+        "enacted": "2014-05-12T19:23:30Z"
     }
 },
 {
-    "pk": 424
-    "model": "core.node", 
+    "pk": 1
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node41.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.128/28", 
+        "updated": "2013-12-09T14:24:19.970Z", 
+        "subnet_id": "e1796711-5584-4bc1-b09b-45dff8f59f32", 
+        "name": "VINI-I2WashDC-public", 
+        "created": "2013-12-09T14:24:19.970Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "7cb4291d-f8d3-4797-83b0-8deefd85bdf5", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 425
-    "model": "core.node", 
+    "pk": 2
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node42.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.112/28", 
+        "updated": "2013-12-09T14:31:41.605Z", 
+        "subnet_id": "1afdc262-767b-4736-9403-584265293a81", 
+        "name": "VINI-I2Seattle-public", 
+        "created": "2013-12-09T14:31:41.605Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "810b4cb8-9d8e-4eee-becc-676785a07725", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 426
-    "model": "core.node", 
+    "pk": 3
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node43.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.96/28", 
+        "updated": "2013-12-09T14:33:10.312Z", 
+        "subnet_id": "c3582780-76f1-4979-97b0-e27f39f18daa", 
+        "name": "VINI-I2SaltLakeCity-public", 
+        "created": "2013-12-09T14:33:10.312Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "4b37f048-11de-4ddd-acaf-2fc5e8716f0e", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 427
-    "model": "core.node", 
+    "pk": 4, 
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node44.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.80/28", 
+        "updated": "2013-12-09T14:34:55.754Z", 
+        "subnet_id": "c0d989f2-f42f-4b3e-a23f-a0063ac4f010", 
+        "name": "VINI-I2NewYork-public", 
+        "created": "2013-12-09T14:34:55.754Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "684386d7-1286-4e58-acda-8ff45deac99e", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 428
-    "model": "core.node", 
+    "pk": 5
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node45.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.64/28", 
+        "updated": "2013-12-09T14:36:09.261Z", 
+        "subnet_id": "d37bab1f-7e01-417c-86c4-ea0d69e2f25d", 
+        "name": "VINI-I2LosAngeles-public", 
+        "created": "2013-12-09T14:36:09.261Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "fa090174-ec59-4b7a-812b-9206d911fb61", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 429
-    "model": "core.node", 
+    "pk": 6
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node46.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.48/28", 
+        "updated": "2013-12-09T14:37:02.420Z", 
+        "subnet_id": "7caa4cfb-846a-4e4c-9984-8ead4091f816", 
+        "name": "VINI-I2KansasCity-public", 
+        "created": "2013-12-09T14:37:02.420Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "017a3914-5eaf-4bcb-8609-6d17ebcdf075", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 430
-    "model": "core.node", 
+    "pk": 7
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node47.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.32/28", 
+        "updated": "2013-12-09T14:38:11.552Z", 
+        "subnet_id": "4438dfbd-099a-4229-bd86-cf29478a009b", 
+        "name": "VINI-I2Houston-public", 
+        "created": "2013-12-09T14:38:11.552Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 431
-    "model": "core.node", 
+    "pk": 8
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node48.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.32/28", 
+        "updated": "2013-12-09T14:39:51.262Z", 
+        "subnet_id": "4438dfbd-099a-4229-bd86-cf29478a009b", 
+        "name": "VINI-I2Houston-public", 
+        "created": "2013-12-09T14:39:51.262Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 432
-    "model": "core.node", 
+    "pk": 9
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node49.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.32/28", 
+        "updated": "2013-12-09T14:41:00.237Z", 
+        "subnet_id": "4438dfbd-099a-4229-bd86-cf29478a009b", 
+        "name": "VINI-I2Houston-public", 
+        "created": "2013-12-09T14:41:00.237Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 433
-    "model": "core.node", 
+    "pk": 10
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node50.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.16/28", 
+        "updated": "2013-12-09T14:42:03.158Z", 
+        "subnet_id": "332113b1-e6f4-492e-ad93-ce21512d3459", 
+        "name": "VINI-I2Chicago-public", 
+        "created": "2013-12-09T14:42:03.158Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "ecdbaf66-b659-4d59-b0b7-1bf6d232ccba", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 434
-    "model": "core.node", 
+    "pk": 11
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node51.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "64.57.18.0/28", 
+        "updated": "2013-12-09T14:42:49.781Z", 
+        "subnet_id": "dafefd4f-2622-4987-9f30-94e9a977cfc3", 
+        "name": "VINI-I2Atlanta-public", 
+        "created": "2013-12-09T14:42:49.781Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "public-net", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "ae4d42e8-a97c-440d-9533-4bcbd62dfb00", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 435
-    "model": "core.node", 
+    "pk": 12
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node52.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-13T21:51:04.425Z", 
+        "subnet_id": "", 
+        "name": "Stork package distribution", 
+        "created": "2013-12-13T21:51:04.425Z", 
+        "permitAllSlices": true, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 11, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 436
-    "model": "core.node", 
+    "pk": 13
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node53.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-13T21:53:07.783Z", 
+        "subnet_id": "", 
+        "name": "Owl Data Collection", 
+        "created": "2013-12-13T21:53:07.783Z", 
+        "permitAllSlices": true, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 12, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 437
-    "model": "core.node", 
+    "pk": 14
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node54.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-13T21:55:51.703Z", 
+        "subnet_id": "", 
+        "name": "Hadoop Shared Filesystem Access", 
+        "created": "2013-12-13T21:55:51.703Z", 
+        "permitAllSlices": true, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 13, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 438, 
-    "model": "core.node", 
-    "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node55.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+    "pk": 15, 
+    "model": "core.network", 
+    "fields": {
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-13T21:57:38.995Z", 
+        "subnet_id": "", 
+        "name": "test-1-public", 
+        "created": "2013-12-13T21:57:38.995Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 14, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 439
-    "model": "core.node", 
+    "pk": 16
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node56.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-13T22:00:40.549Z", 
+        "subnet_id": "", 
+        "name": "test-slice-2-nat", 
+        "created": "2013-12-13T22:00:40.549Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 3, 
+        "owner": 15, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 440
-    "model": "core.node", 
+    "pk": 17
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node57.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:05:09.944Z", 
+        "subnet_id": "", 
+        "name": "infrastructure-private", 
+        "created": "2013-12-18T22:05:09.944Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 441
-    "model": "core.node", 
+    "pk": 18
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node58.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:05:50.112Z", 
+        "subnet_id": "", 
+        "name": "infrastructure-public", 
+        "created": "2013-12-18T22:05:50.112Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 10, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 442
-    "model": "core.node", 
+    "pk": 19
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node59.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:13:17.310Z", 
+        "subnet_id": "", 
+        "name": "dnsdemux-private", 
+        "created": "2013-12-18T22:13:17.310Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 9, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 443
-    "model": "core.node", 
+    "pk": 20
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node60.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:13:38.194Z", 
+        "subnet_id": "", 
+        "name": "dnsdemux-public", 
+        "created": "2013-12-18T22:13:38.194Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 9, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 444
-    "model": "core.node", 
+    "pk": 21
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node61.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:16:19.797Z", 
+        "subnet_id": "", 
+        "name": "DnsRedir-private", 
+        "created": "2013-12-18T22:16:19.797Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 8, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 445
-    "model": "core.node", 
+    "pk": 22
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node62.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:16:38.335Z", 
+        "subnet_id": "", 
+        "name": "DnsRedir-public", 
+        "created": "2013-12-18T22:16:38.335Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 8, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 446
-    "model": "core.node", 
+    "pk": 23
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node63.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-19T00:13:55.598Z", 
+        "subnet_id": "", 
+        "name": "HyperCache-private", 
+        "created": "2013-12-18T22:24:19.109Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [
+            6, 
+            8
+        ], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 4, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 447
-    "model": "core.node", 
+    "pk": 24
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node64.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:24:38.066Z", 
+        "subnet_id": "", 
+        "name": "HyperCache-public", 
+        "created": "2013-12-18T22:24:38.066Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 4, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 448
-    "model": "core.node", 
+    "pk": 25
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node65.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:26:46.435Z", 
+        "subnet_id": "", 
+        "name": "Syndicate-private", 
+        "created": "2013-12-18T22:26:46.435Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 4, 
+        "owner": 6, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 449
-    "model": "core.node", 
+    "pk": 26
+    "model": "core.network", 
     "fields": {
-        "site": 8, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
-        "name": "node66.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "router_id": "", 
+        "subnet": "", 
+        "updated": "2013-12-18T22:27:12.647Z", 
+        "subnet_id": "", 
+        "name": "Syndicate-public", 
+        "created": "2013-12-18T22:27:12.647Z", 
+        "permitAllSlices": false, 
+        "permittedSlices": [], 
+        "labels": "", 
+        "guaranteedBandwidth": 0, 
+        "network_id": "", 
+        "template": 1, 
+        "owner": 6, 
+        "ports": "", 
+        "enacted": null
     }
 },
 {
-    "pk": 450
-    "model": "core.node", 
+    "pk": 1
+    "model": "core.networkslice", 
     "fields": {
-        "site": 8
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5
-        "name": "node67.stanford.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 11
+        "updated": "2013-12-13T21:51:09.711Z", 
+        "enacted": null
+        "network": 12
+        "created": "2013-12-13T21:51:09.711Z"
     }
 },
 {
-    "pk": 451
-    "model": "core.node", 
+    "pk": 2
+    "model": "core.networkslice", 
     "fields": {
-        "site": 8
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5
-        "name": "node68.stanford.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 12
+        "updated": "2013-12-13T21:53:15.909Z", 
+        "enacted": null
+        "network": 13
+        "created": "2013-12-13T21:53:15.909Z"
     }
 },
 {
-    "pk": 452
-    "model": "core.node", 
+    "pk": 3
+    "model": "core.networkslice", 
     "fields": {
-        "site": 8
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5
-        "name": "node69.stanford.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 12
+        "updated": "2013-12-13T21:53:15.914Z", 
+        "enacted": null
+        "network": 12
+        "created": "2013-12-13T21:53:15.914Z"
     }
 },
 {
-    "pk": 453
-    "model": "core.node", 
+    "pk": 4, 
+    "model": "core.networkslice", 
     "fields": {
-        "site": 8
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5
-        "name": "node70.stanford.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 13
+        "updated": "2013-12-13T21:56:04.235Z", 
+        "enacted": null
+        "network": 14
+        "created": "2013-12-13T21:56:04.235Z"
     }
 },
 {
-    "pk": 454
-    "model": "core.node", 
+    "pk": 5
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node1.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 13
+        "updated": "2013-12-13T21:56:04.241Z", 
+        "enacted": null
+        "network": 12
+        "created": "2013-12-13T21:56:04.241Z"
     }
 },
 {
-    "pk": 455
-    "model": "core.node", 
+    "pk": 6
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node2.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 13
+        "updated": "2013-12-13T21:56:04.246Z", 
+        "enacted": null
+        "network": 13
+        "created": "2013-12-13T21:56:04.246Z"
     }
 },
 {
-    "pk": 456
-    "model": "core.node", 
+    "pk": 7
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node3.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 14
+        "updated": "2013-12-13T21:57:56.826Z", 
+        "enacted": null
+        "network": 15
+        "created": "2013-12-13T21:57:56.826Z"
     }
 },
 {
-    "pk": 457
-    "model": "core.node", 
+    "pk": 8
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node4.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 14
+        "updated": "2013-12-13T21:57:56.831Z", 
+        "enacted": null
+        "network": 13
+        "created": "2013-12-13T21:57:56.831Z"
     }
 },
 {
-    "pk": 458
-    "model": "core.node", 
+    "pk": 9
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node5.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 14
+        "updated": "2013-12-13T21:57:56.836Z", 
+        "enacted": null
+        "network": 12
+        "created": "2013-12-13T21:57:56.836Z"
     }
 },
 {
-    "pk": 459
-    "model": "core.node", 
+    "pk": 10
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node6.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 15
+        "updated": "2013-12-13T22:01:14.038Z", 
+        "enacted": null
+        "network": 16
+        "created": "2013-12-13T22:01:14.038Z"
     }
 },
 {
-    "pk": 460
-    "model": "core.node", 
+    "pk": 11
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node7.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 15
+        "updated": "2013-12-13T22:01:14.043Z", 
+        "enacted": null
+        "network": 14
+        "created": "2013-12-13T22:01:14.043Z"
     }
 },
 {
-    "pk": 461
-    "model": "core.node", 
+    "pk": 12
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node8.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 10
+        "updated": "2013-12-18T22:06:00.381Z", 
+        "enacted": null
+        "network": 17
+        "created": "2013-12-18T22:06:00.381Z"
     }
 },
 {
-    "pk": 462
-    "model": "core.node", 
+    "pk": 13
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node9.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 10
+        "updated": "2013-12-18T22:06:00.386Z", 
+        "enacted": null
+        "network": 18
+        "created": "2013-12-18T22:06:00.386Z"
     }
 },
 {
-    "pk": 463
-    "model": "core.node", 
+    "pk": 14
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node10.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 9, 
+        "updated": "2013-12-18T22:13:42.177Z", 
+        "enacted": null
+        "network": 19
+        "created": "2013-12-18T22:13:42.177Z"
     }
 },
 {
-    "pk": 464
-    "model": "core.node", 
+    "pk": 15
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node11.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 9, 
+        "updated": "2013-12-18T22:13:42.183Z", 
+        "enacted": null
+        "network": 20
+        "created": "2013-12-18T22:13:42.183Z"
     }
 },
 {
-    "pk": 465
-    "model": "core.node", 
+    "pk": 16
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node12.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 8
+        "updated": "2013-12-18T22:16:41.007Z", 
+        "enacted": null
+        "network": 21
+        "created": "2013-12-18T22:16:41.007Z"
     }
 },
 {
-    "pk": 466
-    "model": "core.node", 
+    "pk": 17
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node13.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 8
+        "updated": "2013-12-18T22:16:41.013Z", 
+        "enacted": null
+        "network": 22
+        "created": "2013-12-18T22:16:41.013Z"
     }
 },
 {
-    "pk": 467
-    "model": "core.node", 
+    "pk": 18
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node14.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 4
+        "updated": "2013-12-18T22:24:44.997Z", 
+        "enacted": null
+        "network": 23
+        "created": "2013-12-18T22:24:44.997Z"
     }
 },
 {
-    "pk": 468
-    "model": "core.node", 
+    "pk": 19
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node15.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 4
+        "updated": "2013-12-18T22:24:45.003Z", 
+        "enacted": null
+        "network": 24
+        "created": "2013-12-18T22:24:45.003Z"
     }
 },
 {
-    "pk": 469
-    "model": "core.node", 
+    "pk": 20
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node16.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 6
+        "updated": "2013-12-18T22:27:16.953Z", 
+        "enacted": null
+        "network": 25
+        "created": "2013-12-18T22:27:16.953Z"
     }
 },
 {
-    "pk": 470
-    "model": "core.node", 
+    "pk": 21
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node17.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 6
+        "updated": "2013-12-18T22:27:16.959Z", 
+        "enacted": null
+        "network": 26
+        "created": "2013-12-18T22:27:16.959Z"
     }
 },
 {
-    "pk": 471
-    "model": "core.node", 
+    "pk": 22
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node18.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 6
+        "updated": "2013-12-19T00:14:36.949Z", 
+        "enacted": null
+        "network": 23
+        "created": "2013-12-19T00:14:36.949Z"
     }
 },
 {
-    "pk": 472
-    "model": "core.node", 
+    "pk": 23
+    "model": "core.networkslice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node19.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "slice": 8
+        "updated": "2013-12-19T00:15:11.362Z", 
+        "enacted": null
+        "network": 23
+        "created": "2013-12-19T00:15:11.362Z"
     }
 },
 {
-    "pk": 473
-    "model": "core.node", 
+    "pk": 1
+    "model": "core.networkparametertype", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node20.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "description": "End of IPv4 address allocation pool"
+        "updated": "2013-12-09T14:43:25.664Z", 
+        "enacted": null
+        "name": "allocation-pool-end", 
+        "created": "2013-12-09T14:43:25.664Z"
     }
 },
 {
-    "pk": 474
-    "model": "core.node", 
+    "pk": 2
+    "model": "core.networkparametertype", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node21.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "description": "Start of IPv4 address allocation pool"
+        "updated": "2013-12-09T14:43:45.564Z", 
+        "enacted": null
+        "name": "allocation-pool-start", 
+        "created": "2013-12-09T14:43:45.564Z"
     }
 },
 {
-    "pk": 475
-    "model": "core.node", 
+    "pk": 3
+    "model": "core.networkparametertype", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node22.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "description": "CIDR block for network"
+        "updated": "2013-12-09T14:44:05.513Z", 
+        "enacted": null
+        "name": "cidr", 
+        "created": "2013-12-09T14:44:05.513Z"
     }
 },
 {
-    "pk": 476
-    "model": "core.node", 
+    "pk": 14
+    "model": "core.account", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node23.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:00.470Z", 
+        "enacted": null, 
+        "site": 10, 
+        "created": "2013-12-18T21:29:00.470Z"
     }
 },
 {
-    "pk": 477
-    "model": "core.node", 
+    "pk": 15
+    "model": "core.account", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node24.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:00.495Z", 
+        "enacted": null, 
+        "site": 22, 
+        "created": "2013-12-18T21:29:00.495Z"
     }
 },
-{
-    "pk": 478
-    "model": "core.node", 
+{
+    "pk": 16
+    "model": "core.account", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node25.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:00.502Z", 
+        "enacted": null, 
+        "site": 24, 
+        "created": "2013-12-18T21:29:00.502Z"
     }
 },
 {
-    "pk": 479
-    "model": "core.node", 
+    "pk": 63
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node26.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-18T21:00:00Z"
+        "updated": "2013-12-18T21:29:16.421Z", 
+        "enacted": null
+        "account": 14
+        "created": "2013-12-18T21:29:16.421Z"
     }
 },
 {
-    "pk": 480
-    "model": "core.node", 
+    "pk": 64
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node27.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-24T21:00:00Z"
+        "updated": "2013-12-18T21:29:16.434Z", 
+        "enacted": null
+        "account": 14
+        "created": "2013-12-18T21:29:16.434Z"
     }
 },
 {
-    "pk": 481
-    "model": "core.node", 
+    "pk": 65
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node28.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-01T21:00:00Z"
+        "updated": "2013-12-18T21:29:17.229Z", 
+        "enacted": null
+        "account": 14
+        "created": "2013-12-18T21:29:17.229Z"
     }
 },
 {
-    "pk": 482
-    "model": "core.node", 
+    "pk": 66
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node29.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-08T21:00:00Z"
+        "updated": "2013-12-18T21:29:18.213Z", 
+        "enacted": null
+        "account": 14
+        "created": "2013-12-18T21:29:18.212Z"
     }
 },
 {
-    "pk": 483
-    "model": "core.node", 
+    "pk": 67
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node30.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-15T21:00:00Z"
+        "updated": "2013-12-18T21:29:19.091Z", 
+        "enacted": null
+        "account": 14
+        "created": "2013-12-18T21:29:19.091Z"
     }
 },
 {
-    "pk": 484
-    "model": "core.node", 
+    "pk": 68
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node31.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-18T21:00:00Z"
+        "updated": "2013-12-18T21:29:20.175Z", 
+        "enacted": null
+        "account": 15
+        "created": "2013-12-18T21:29:20.175Z"
     }
 },
 {
-    "pk": 485
-    "model": "core.node", 
+    "pk": 69
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node32.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-24T21:00:00Z"
+        "updated": "2013-12-18T21:29:20.193Z", 
+        "enacted": null
+        "account": 15
+        "created": "2013-12-18T21:29:20.193Z"
     }
 },
 {
-    "pk": 486
-    "model": "core.node", 
+    "pk": 70
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node33.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-01T21:00:00Z"
+        "updated": "2013-12-18T21:29:22.239Z", 
+        "enacted": null
+        "account": 15
+        "created": "2013-12-18T21:29:22.239Z"
     }
 },
 {
-    "pk": 487
-    "model": "core.node", 
+    "pk": 71
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node34.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-08T21:00:00Z"
+        "updated": "2013-12-18T21:29:24.550Z", 
+        "enacted": null
+        "account": 15
+        "created": "2013-12-18T21:29:24.550Z"
     }
 },
 {
-    "pk": 488
-    "model": "core.node", 
+    "pk": 72
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node35.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-15T21:00:00Z"
+        "updated": "2013-12-18T21:29:26.820Z", 
+        "enacted": null
+        "account": 15
+        "created": "2013-12-18T21:29:26.820Z"
     }
 },
 {
-    "pk": 489
-    "model": "core.node", 
+    "pk": 73
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node36.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-18T21:00:00Z"
+        "updated": "2013-12-18T21:29:29.206Z", 
+        "enacted": null
+        "account": 16
+        "created": "2013-12-18T21:29:29.206Z"
     }
 },
 {
-    "pk": 490
-    "model": "core.node", 
+    "pk": 74
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node37.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-11-24T21:00:00Z"
+        "updated": "2013-12-18T21:29:29.222Z", 
+        "enacted": null
+        "account": 16
+        "created": "2013-12-18T21:29:29.222Z"
     }
 },
 {
-    "pk": 491
-    "model": "core.node", 
+    "pk": 75
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node38.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-01T21:00:00Z"
+        "updated": "2013-12-18T21:29:29.538Z", 
+        "enacted": null
+        "account": 16
+        "created": "2013-12-18T21:29:29.538Z"
     }
 },
 {
-    "pk": 492
-    "model": "core.node", 
+    "pk": 76
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node39.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-08T21:00:00Z"
+        "updated": "2013-12-18T21:29:29.894Z", 
+        "enacted": null
+        "account": 16
+        "created": "2013-12-18T21:29:29.894Z"
     }
 },
 {
-    "pk": 493
-    "model": "core.node", 
+    "pk": 77
+    "model": "core.invoice", 
     "fields": {
-        "site": 9
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6
-        "name": "node40.washington.vicci.org"
-        "created": "2013-04-03T23:14:11.072Z"
+        "date": "2013-12-15T21:00:00Z"
+        "updated": "2013-12-18T21:29:30.251Z", 
+        "enacted": null
+        "account": 16
+        "created": "2013-12-18T21:29:30.251Z"
     }
 },
 {
-    "pk": 494, 
-    "model": "core.node", 
+    "pk": 104, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node41.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:00.529Z", 
+        "enacted": null, 
+        "name": "node17.washington.vicci.org", 
+        "created": "2013-12-18T21:29:00.529Z"
     }
 },
 {
-    "pk": 495, 
-    "model": "core.node", 
+    "pk": 105, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node42.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.289Z", 
+        "enacted": null, 
+        "name": "node16.washington.vicci.org", 
+        "created": "2013-12-18T21:29:01.289Z"
     }
 },
 {
-    "pk": 496, 
-    "model": "core.node", 
+    "pk": 106, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node43.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.189Z", 
+        "enacted": null, 
+        "name": "node15.washington.vicci.org", 
+        "created": "2013-12-18T21:29:02.189Z"
     }
 },
 {
-    "pk": 497, 
-    "model": "core.node", 
+    "pk": 107, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node44.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:03.178Z", 
+        "enacted": null, 
+        "name": "node14.washington.vicci.org", 
+        "created": "2013-12-18T21:29:03.178Z"
     }
 },
 {
-    "pk": 498, 
-    "model": "core.node", 
+    "pk": 108, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node45.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:03.942Z", 
+        "enacted": null, 
+        "name": "node70.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:03.942Z"
     }
 },
 {
-    "pk": 499, 
-    "model": "core.node", 
+    "pk": 109, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node46.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:04.702Z", 
+        "enacted": null, 
+        "name": "node69.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:04.702Z"
     }
 },
 {
-    "pk": 500, 
-    "model": "core.node", 
+    "pk": 110, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node47.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:05.547Z", 
+        "enacted": null, 
+        "name": "node68.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:05.547Z"
     }
 },
 {
-    "pk": 501, 
-    "model": "core.node", 
+    "pk": 111, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node48.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:06.336Z", 
+        "enacted": null, 
+        "name": "node67.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:06.336Z"
     }
 },
 {
-    "pk": 502, 
-    "model": "core.node", 
+    "pk": 112, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node49.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:07.101Z", 
+        "enacted": null, 
+        "name": "node30.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:07.101Z"
     }
 },
 {
-    "pk": 503, 
-    "model": "core.node", 
+    "pk": 113, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node50.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:09.453Z", 
+        "enacted": null, 
+        "name": "node55.stanford.vicci.org", 
+        "created": "2013-12-18T21:29:09.453Z"
     }
 },
 {
-    "pk": 504, 
-    "model": "core.node", 
+    "pk": 114, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node51.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:10.216Z", 
+        "enacted": null, 
+        "name": "node12.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:10.216Z"
     }
 },
 {
-    "pk": 505, 
-    "model": "core.node", 
+    "pk": 115, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node52.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:10.975Z", 
+        "enacted": null, 
+        "name": "node20.washington.vicci.org", 
+        "created": "2013-12-18T21:29:10.975Z"
     }
 },
 {
-    "pk": 506, 
-    "model": "core.node", 
+    "pk": 116, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node53.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:11.729Z", 
+        "enacted": null, 
+        "name": "node1.stanford.vicci.org", 
+        "created": "2013-12-18T21:29:11.729Z"
     }
 },
 {
-    "pk": 507, 
-    "model": "core.node", 
+    "pk": 117, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node54.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:12.494Z", 
+        "enacted": null, 
+        "name": "node33.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:12.494Z"
     }
 },
 {
-    "pk": 508, 
-    "model": "core.node", 
+    "pk": 118, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node55.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:13.329Z", 
+        "enacted": null, 
+        "name": "node15.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:13.329Z"
     }
 },
 {
-    "pk": 509, 
-    "model": "core.node", 
+    "pk": 119, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node56.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:14.083Z", 
+        "enacted": null, 
+        "name": "node23.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:14.083Z"
     }
 },
 {
-    "pk": 510, 
-    "model": "core.node", 
+    "pk": 120, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node57.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:14.847Z", 
+        "enacted": null, 
+        "name": "node10.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:14.847Z"
     }
 },
 {
-    "pk": 511, 
-    "model": "core.node", 
+    "pk": 121, 
+    "model": "core.usableobject", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node58.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:15.609Z", 
+        "enacted": null, 
+        "name": "node13.princeton.vicci.org", 
+        "created": "2013-12-18T21:29:15.609Z"
     }
 },
 {
-    "pk": 512
-    "model": "core.node", 
+    "pk": 37
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node59.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:19.973Z", 
+        "created": "2013-12-18T21:29:19.973Z", 
+        "account": 14, 
+        "amount": 0.2968, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 513
-    "model": "core.node", 
+    "pk": 38
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node60.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:19.979Z", 
+        "created": "2013-12-18T21:29:19.979Z", 
+        "account": 14, 
+        "amount": 21.14, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 514
-    "model": "core.node", 
+    "pk": 39
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node61.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:19.987Z", 
+        "created": "2013-12-18T21:29:19.987Z", 
+        "account": 14, 
+        "amount": 24.3768, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 515
-    "model": "core.node", 
+    "pk": 40
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node62.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:29.154Z", 
+        "created": "2013-12-18T21:29:29.153Z", 
+        "account": 15, 
+        "amount": 0.3024, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 516
-    "model": "core.node", 
+    "pk": 41
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node63.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:29.166Z", 
+        "created": "2013-12-18T21:29:29.166Z", 
+        "account": 15, 
+        "amount": 86.5536, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 517
-    "model": "core.node", 
+    "pk": 42
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node64.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:29.174Z", 
+        "created": "2013-12-18T21:29:29.174Z", 
+        "account": 15, 
+        "amount": 96.404, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 518
-    "model": "core.node", 
+    "pk": 43
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node65.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:30.620Z", 
+        "created": "2013-12-18T21:29:30.620Z", 
+        "account": 16, 
+        "amount": 0.1848, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 519
-    "model": "core.node", 
+    "pk": 44
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node66.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:30.626Z", 
+        "created": "2013-12-18T21:29:30.626Z", 
+        "account": 16, 
+        "amount": 8.5904, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 520
-    "model": "core.node", 
+    "pk": 45
+    "model": "core.payment", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node67.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:30.634Z", 
+        "created": "2013-12-18T21:29:30.634Z", 
+        "account": 16, 
+        "amount": 10.0016, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
-    "pk": 521, 
-    "model": "core.node", 
+    "pk": 59761, 
+    "model": "core.charge", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node68.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.186Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.540Z", 
+        "amount": 0.3024, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 68, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 522, 
-    "model": "core.node", 
+    "pk": 59762, 
+    "model": "core.charge", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node69.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.302Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.550Z", 
+        "amount": 0.1176, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 523, 
-    "model": "core.node", 
+    "pk": 59763, 
+    "model": "core.charge", 
     "fields": {
-        "site": 9, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
-        "name": "node70.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.409Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.558Z", 
+        "amount": 0.2016, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 524, 
-    "model": "core.node", 
+    "pk": 59764, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node1.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.517Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.567Z", 
+        "amount": 0.3024, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 525, 
-    "model": "core.node", 
+    "pk": 59765, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node2.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.625Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.575Z", 
+        "amount": 0.1848, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 526, 
-    "model": "core.node", 
+    "pk": 59766, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node3.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.732Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.583Z", 
+        "amount": 0.3192, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 527, 
-    "model": "core.node", 
+    "pk": 59767, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node4.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.840Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.591Z", 
+        "amount": 0.1512, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 528, 
-    "model": "core.node", 
+    "pk": 59768, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node5.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.948Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.600Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 529, 
-    "model": "core.node", 
+    "pk": 59769, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node6.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.055Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.608Z", 
+        "amount": 0.3248, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 530, 
-    "model": "core.node", 
+    "pk": 59770, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node7.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.163Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.616Z", 
+        "amount": 0.14, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 531, 
-    "model": "core.node", 
+    "pk": 59771, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node8.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.271Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.625Z", 
+        "amount": 0.1288, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 532, 
-    "model": "core.node", 
+    "pk": 59772, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node9.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.378Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.633Z", 
+        "amount": 0.336, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 533, 
-    "model": "core.node", 
+    "pk": 59773, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node10.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.486Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.641Z", 
+        "amount": 0.3192, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 534, 
-    "model": "core.node", 
+    "pk": 59774, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node11.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.594Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.650Z", 
+        "amount": 0.2184, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 535, 
-    "model": "core.node", 
+    "pk": 59775, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node12.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.702Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.658Z", 
+        "amount": 0.252, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.6, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 536, 
-    "model": "core.node", 
+    "pk": 59776, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node13.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.809Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.666Z", 
+        "amount": 0.1232, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 537, 
-    "model": "core.node", 
+    "pk": 59777, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node14.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.917Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.674Z", 
+        "amount": 0.1624, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 538, 
-    "model": "core.node", 
+    "pk": 59778, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node15.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.025Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.683Z", 
+        "amount": 0.1904, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 539, 
-    "model": "core.node", 
+    "pk": 59779, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node16.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.132Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.691Z", 
+        "amount": 0.1624, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 540, 
-    "model": "core.node", 
+    "pk": 59780, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node17.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.248Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.699Z", 
+        "amount": 0.2912, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 541, 
-    "model": "core.node", 
+    "pk": 59781, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node18.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.356Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.708Z", 
+        "amount": 0.2072, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 542, 
-    "model": "core.node", 
+    "pk": 59782, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node19.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.464Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.716Z", 
+        "amount": 0.1456, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 543, 
-    "model": "core.node", 
+    "pk": 59783, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node20.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.613Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.724Z", 
+        "amount": 0.2408, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 544, 
-    "model": "core.node", 
+    "pk": 59784, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node21.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.721Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.732Z", 
+        "amount": 0.3024, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 545, 
-    "model": "core.node", 
+    "pk": 59785, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node22.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.828Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.741Z", 
+        "amount": 0.1792, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 546, 
-    "model": "core.node", 
+    "pk": 59786, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node23.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.936Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.749Z", 
+        "amount": 0.1736, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 547, 
-    "model": "core.node", 
+    "pk": 59787, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node24.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.043Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.757Z", 
+        "amount": 0.1512, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 548, 
-    "model": "core.node", 
+    "pk": 59788, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node25.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.151Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.766Z", 
+        "amount": 0.1288, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 549, 
-    "model": "core.node", 
+    "pk": 59789, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node26.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.259Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.774Z", 
+        "amount": 0.2408, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 550, 
-    "model": "core.node", 
+    "pk": 59790, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node27.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.367Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.782Z", 
+        "amount": 0.1344, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 551, 
-    "model": "core.node", 
+    "pk": 59791, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node28.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.474Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.790Z", 
+        "amount": 0.2184, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 552, 
-    "model": "core.node", 
+    "pk": 59792, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node29.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.582Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.799Z", 
+        "amount": 0.308, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 553, 
-    "model": "core.node", 
+    "pk": 59793, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node30.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.690Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.807Z", 
+        "amount": 0.2968, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 554, 
-    "model": "core.node", 
+    "pk": 59794, 
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node31.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.797Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.815Z", 
+        "amount": 0.2352, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 59795, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:23.905Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.823Z", 
+        "amount": 0.1904, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 555
-    "model": "core.node", 
+    "pk": 59796
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node32.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.013Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.832Z", 
+        "amount": 0.336, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 556
-    "model": "core.node", 
+    "pk": 59797
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node33.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.120Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.840Z", 
+        "amount": 0.1176, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 557
-    "model": "core.node", 
+    "pk": 59798
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node34.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.228Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.848Z", 
+        "amount": 0.2968, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 558
-    "model": "core.node", 
+    "pk": 59799
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node35.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.336Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.856Z", 
+        "amount": 0.1288, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 559
-    "model": "core.node", 
+    "pk": 59800
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node36.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.443Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.865Z", 
+        "amount": 0.2016, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 560
-    "model": "core.node", 
+    "pk": 59801
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node37.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.559Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.873Z", 
+        "amount": 0.1288, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 561
-    "model": "core.node", 
+    "pk": 59802
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node38.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.667Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.881Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 562
-    "model": "core.node", 
+    "pk": 59803
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node39.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.775Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.890Z", 
+        "amount": 0.2912, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 563
-    "model": "core.node", 
+    "pk": 59804
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node40.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.883Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.898Z", 
+        "amount": 0.168, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 564
-    "model": "core.node", 
+    "pk": 59805
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node41.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.990Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.906Z", 
+        "amount": 0.3304, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 565
-    "model": "core.node", 
+    "pk": 59806
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node42.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.098Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.915Z", 
+        "amount": 0.3136, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 566
-    "model": "core.node", 
+    "pk": 59807
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node43.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.206Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.923Z", 
+        "amount": 0.168, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 567
-    "model": "core.node", 
+    "pk": 59808
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node44.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.313Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.931Z", 
+        "amount": 0.1176, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 568
-    "model": "core.node", 
+    "pk": 59809
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node45.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.421Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.939Z", 
+        "amount": 0.2576, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 569
-    "model": "core.node", 
+    "pk": 59810
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node46.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.529Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.948Z", 
+        "amount": 0.14, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 570
-    "model": "core.node", 
+    "pk": 59811
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node47.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.637Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.956Z", 
+        "amount": 0.2576, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 571
-    "model": "core.node", 
+    "pk": 59812
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node48.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.744Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.964Z", 
+        "amount": 0.2128, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 572
-    "model": "core.node", 
+    "pk": 59813
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node49.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.852Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.973Z", 
+        "amount": 0.2576, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 573
-    "model": "core.node", 
+    "pk": 59814
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node50.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.959Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.981Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 574
-    "model": "core.node", 
+    "pk": 59815
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node51.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.067Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.989Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 575
-    "model": "core.node", 
+    "pk": 59816
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node52.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.175Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:00.997Z", 
+        "amount": 0.2912, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 576
-    "model": "core.node", 
+    "pk": 59817
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node53.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.283Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.006Z", 
+        "amount": 0.14, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 577
-    "model": "core.node", 
+    "pk": 59818
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node54.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.390Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.014Z", 
+        "amount": 0.1176, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 578
-    "model": "core.node", 
+    "pk": 59819
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node55.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.498Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.022Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 579
-    "model": "core.node", 
+    "pk": 59820
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node56.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.606Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.031Z", 
+        "amount": 0.3304, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 580
-    "model": "core.node", 
+    "pk": 59821
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node57.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.713Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.039Z", 
+        "amount": 0.336, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 581
-    "model": "core.node", 
+    "pk": 59822
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node58.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.829Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.047Z", 
+        "amount": 0.2912, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 582
-    "model": "core.node", 
+    "pk": 59823
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node59.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.937Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.055Z", 
+        "amount": 0.2128, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 583
-    "model": "core.node", 
+    "pk": 59824
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node60.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.045Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.064Z", 
+        "amount": 0.1848, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 584
-    "model": "core.node", 
+    "pk": 59825
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node61.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.152Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.072Z", 
+        "amount": 0.2632, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 585
-    "model": "core.node", 
+    "pk": 59826
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node62.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.260Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.080Z", 
+        "amount": 0.1288, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 586
-    "model": "core.node", 
+    "pk": 59827
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node63.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.368Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.088Z", 
+        "amount": 0.2744, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 587
-    "model": "core.node", 
+    "pk": 59828
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node64.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.475Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.097Z", 
+        "amount": 0.1848, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 588
-    "model": "core.node", 
+    "pk": 59829
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node65.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.641Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.105Z", 
+        "amount": 0.1456, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 589
-    "model": "core.node", 
+    "pk": 59830
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node66.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.749Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.113Z", 
+        "amount": 0.2296, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 590
-    "model": "core.node", 
+    "pk": 59831
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node67.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.856Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.122Z", 
+        "amount": 0.3024, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 591
-    "model": "core.node", 
+    "pk": 59832
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node68.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.964Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.130Z", 
+        "amount": 0.2912, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 592
-    "model": "core.node", 
+    "pk": 59833
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node69.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.072Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.138Z", 
+        "amount": 0.2856, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 593
-    "model": "core.node", 
+    "pk": 59834
+    "model": "core.charge", 
     "fields": {
-        "site": 10, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
-        "name": "node70.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.180Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.147Z", 
+        "amount": 0.308, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 594
-    "model": "core.node", 
+    "pk": 59835
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node1.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.287Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.155Z", 
+        "amount": 0.1848, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 595
-    "model": "core.node", 
+    "pk": 59836
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node2.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.395Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.163Z", 
+        "amount": 0.2688, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 596
-    "model": "core.node", 
+    "pk": 59837
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node3.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.503Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.171Z", 
+        "amount": 0.1344, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 59838, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:28.610Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.180Z", 
+        "amount": 0.2856, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 597
-    "model": "core.node", 
+    "pk": 59839
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node4.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.718Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.188Z", 
+        "amount": 0.3024, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 598, 
-    "model": "core.node", 
+    "pk": 59840
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node5.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.826Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.196Z", 
+        "amount": 0.308, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 599
-    "model": "core.node", 
+    "pk": 59841
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node6.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.933Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.205Z", 
+        "amount": 0.308, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 600
-    "model": "core.node", 
+    "pk": 59842
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node7.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:29.041Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.213Z", 
+        "amount": 0.2576, 
+        "object": 104, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 601
-    "model": "core.node", 
+    "pk": 59843
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node8.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.221Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.221Z", 
+        "amount": 0.196, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.8, 
+        "invoice": null, 
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 602
-    "model": "core.node", 
+    "pk": 59844
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node9.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.230Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.229Z", 
+        "amount": 0.168, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.4, 
+        "invoice": null, 
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 603
-    "model": "core.node", 
+    "pk": 59845
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node10.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.238Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.238Z", 
+        "amount": 0.2576, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.68, 
+        "invoice": null, 
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 604
-    "model": "core.node", 
+    "pk": 59846
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node11.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.246Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.246Z", 
+        "amount": 0.168, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.4, 
+        "invoice": null, 
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 605
-    "model": "core.node", 
+    "pk": 59847
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node12.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.254Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.254Z", 
+        "amount": 0.3248, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.64, 
+        "invoice": null, 
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 606
-    "model": "core.node", 
+    "pk": 59848
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node13.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.263Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.263Z", 
+        "amount": 0.28, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.0, 
+        "invoice": null, 
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 607
-    "model": "core.node", 
+    "pk": 59849
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node14.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.271Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.271Z", 
+        "amount": 0.28, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.0, 
+        "invoice": null, 
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 608
-    "model": "core.node", 
+    "pk": 59850
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node15.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:01.279Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.279Z", 
+        "amount": 0.3304, 
+        "object": 104, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.72, 
+        "invoice": null, 
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 609
-    "model": "core.node", 
+    "pk": 59851
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node16.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.202Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.294Z", 
+        "amount": 0.1456, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 610
-    "model": "core.node", 
+    "pk": 59852
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node17.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.310Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.304Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 611
-    "model": "core.node", 
+    "pk": 59853
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node18.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.417Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.312Z", 
+        "amount": 0.3192, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 612
-    "model": "core.node", 
+    "pk": 59854
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node19.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.525Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.320Z", 
+        "amount": 0.2464, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 613
-    "model": "core.node", 
+    "pk": 59855
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node20.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.633Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.329Z", 
+        "amount": 0.2184, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 614
-    "model": "core.node", 
+    "pk": 59856
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node21.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.741Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.337Z", 
+        "amount": 0.168, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 615
-    "model": "core.node", 
+    "pk": 59857
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node22.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.848Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.345Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 616
-    "model": "core.node", 
+    "pk": 59858
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node23.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.956Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.353Z", 
+        "amount": 0.2912, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 617
-    "model": "core.node", 
+    "pk": 59859
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node24.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.064Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.362Z", 
+        "amount": 0.2184, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 618
-    "model": "core.node", 
+    "pk": 59860
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node25.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.171Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.370Z", 
+        "amount": 0.14, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 619
-    "model": "core.node", 
+    "pk": 59861
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node26.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.279Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.378Z", 
+        "amount": 0.3248, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 620
-    "model": "core.node", 
+    "pk": 59862
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node27.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.387Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.387Z", 
+        "amount": 0.1904, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 621
-    "model": "core.node", 
+    "pk": 59863
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node28.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.494Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.395Z", 
+        "amount": 0.2632, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 622
-    "model": "core.node", 
+    "pk": 59864
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node29.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.602Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.403Z", 
+        "amount": 0.336, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 623
-    "model": "core.node", 
+    "pk": 59865
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node30.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.710Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.412Z", 
+        "amount": 0.2688, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 624
-    "model": "core.node", 
+    "pk": 59866
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node31.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.818Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.420Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 625
-    "model": "core.node", 
+    "pk": 59867
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node32.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.925Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.428Z", 
+        "amount": 0.2128, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 626
-    "model": "core.node", 
+    "pk": 59868
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node33.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.033Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.436Z", 
+        "amount": 0.196, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 627
-    "model": "core.node", 
+    "pk": 59869
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node34.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.141Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.445Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 628
-    "model": "core.node", 
+    "pk": 59870
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node35.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.257Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.453Z", 
+        "amount": 0.1288, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 629
-    "model": "core.node", 
+    "pk": 59871
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node36.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.364Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.461Z", 
+        "amount": 0.1736, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 630
-    "model": "core.node", 
+    "pk": 59872
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node37.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.472Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.470Z", 
+        "amount": 0.112, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 631
-    "model": "core.node", 
+    "pk": 59873
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node38.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.621Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.478Z", 
+        "amount": 0.2128, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 632
-    "model": "core.node", 
+    "pk": 59874
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node39.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.729Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.486Z", 
+        "amount": 0.308, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 633
-    "model": "core.node", 
+    "pk": 59875
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node40.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.836Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.494Z", 
+        "amount": 0.1512, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 634
-    "model": "core.node", 
+    "pk": 59876
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node41.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.944Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.503Z", 
+        "amount": 0.112, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 635
-    "model": "core.node", 
+    "pk": 59877
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node42.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.052Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.511Z", 
+        "amount": 0.308, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 636
-    "model": "core.node", 
+    "pk": 59878
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node43.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.160Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.519Z", 
+        "amount": 0.2072, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 637
-    "model": "core.node", 
+    "pk": 59879
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node44.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.267Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.528Z", 
+        "amount": 0.28, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 59880, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:23.375Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.536Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 638
-    "model": "core.node", 
+    "pk": 59881
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node45.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.483Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.544Z", 
+        "amount": 0.224, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 639
-    "model": "core.node", 
+    "pk": 59882
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node46.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.590Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.552Z", 
+        "amount": 0.1568, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 640
-    "model": "core.node", 
+    "pk": 59883
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node47.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.698Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.561Z", 
+        "amount": 0.2968, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 641
-    "model": "core.node", 
+    "pk": 59884
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node48.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.806Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.569Z", 
+        "amount": 0.1232, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 642
-    "model": "core.node", 
+    "pk": 59885
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node49.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.913Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.577Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 643
-    "model": "core.node", 
+    "pk": 59886
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node50.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.021Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.586Z", 
+        "amount": 0.1736, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 644
-    "model": "core.node", 
+    "pk": 59887
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node51.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.129Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.594Z", 
+        "amount": 0.196, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 645
-    "model": "core.node", 
+    "pk": 59888
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node52.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.236Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.602Z", 
+        "amount": 0.1344, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 646
-    "model": "core.node", 
+    "pk": 59889
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node53.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.344Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.610Z", 
+        "amount": 0.1904, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 647
-    "model": "core.node", 
+    "pk": 59890
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node54.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.452Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.619Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 648
-    "model": "core.node", 
+    "pk": 59891
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node55.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.568Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.627Z", 
+        "amount": 0.2072, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 649
-    "model": "core.node", 
+    "pk": 59892
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node56.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.676Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.635Z", 
+        "amount": 0.2968, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 650
-    "model": "core.node", 
+    "pk": 59893
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node57.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.783Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.644Z", 
+        "amount": 0.3136, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 651
-    "model": "core.node", 
+    "pk": 59894
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node58.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.891Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.652Z", 
+        "amount": 0.1288, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 652
-    "model": "core.node", 
+    "pk": 59895
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node59.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.999Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.660Z", 
+        "amount": 0.1568, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.24, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 653
-    "model": "core.node", 
+    "pk": 59896
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node60.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.106Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.669Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 654
-    "model": "core.node", 
+    "pk": 59897
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node61.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.214Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.677Z", 
+        "amount": 0.3024, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 655
-    "model": "core.node", 
+    "pk": 59898
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node62.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.322Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.685Z", 
+        "amount": 0.2856, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 656
-    "model": "core.node", 
+    "pk": 59899
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node63.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.429Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.693Z", 
+        "amount": 0.2912, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 657
-    "model": "core.node", 
+    "pk": 59900
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node64.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.537Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.702Z", 
+        "amount": 0.1288, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 658
-    "model": "core.node", 
+    "pk": 59901
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node65.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.645Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.710Z", 
+        "amount": 0.3136, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 659
-    "model": "core.node", 
+    "pk": 59902
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node66.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.752Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.718Z", 
+        "amount": 0.3248, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 660
-    "model": "core.node", 
+    "pk": 59903
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node67.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.860Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.727Z", 
+        "amount": 0.3024, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 661
-    "model": "core.node", 
+    "pk": 59904
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node68.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.968Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.735Z", 
+        "amount": 0.14, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 662
-    "model": "core.node", 
+    "pk": 59905
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node69.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.075Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.743Z", 
+        "amount": 0.3304, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 663
-    "model": "core.node", 
+    "pk": 59906
+    "model": "core.charge", 
     "fields": {
-        "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
-        "name": "node70.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.183Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.751Z", 
+        "amount": 0.2744, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 664
-    "model": "core.node", 
+    "pk": 59907
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node1.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.291Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.760Z", 
+        "amount": 0.2632, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 665
-    "model": "core.node", 
+    "pk": 59908
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node2.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.399Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.768Z", 
+        "amount": 0.2408, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.44, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 666
-    "model": "core.node", 
+    "pk": 59909
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node3.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.506Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.776Z", 
+        "amount": 0.1624, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 667
-    "model": "core.node", 
+    "pk": 59910
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node4.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.614Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.784Z", 
+        "amount": 0.2968, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 668
-    "model": "core.node", 
+    "pk": 59911
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node5.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.722Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.793Z", 
+        "amount": 0.2016, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 669
-    "model": "core.node", 
+    "pk": 59912
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node6.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.838Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.801Z", 
+        "amount": 0.2296, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 670
-    "model": "core.node", 
+    "pk": 59913
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node7.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.945Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.809Z", 
+        "amount": 0.2128, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 671
-    "model": "core.node", 
+    "pk": 59914
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node8.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.053Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.818Z", 
+        "amount": 0.112, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 672
-    "model": "core.node", 
+    "pk": 59915
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node9.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.161Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.826Z", 
+        "amount": 0.168, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 673
-    "model": "core.node", 
+    "pk": 59916
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node10.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.268Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.834Z", 
+        "amount": 0.168, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 674
-    "model": "core.node", 
+    "pk": 59917
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node11.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.376Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.842Z", 
+        "amount": 0.196, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 675
-    "model": "core.node", 
+    "pk": 59918
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node12.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.484Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.851Z", 
+        "amount": 0.2464, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 676
-    "model": "core.node", 
+    "pk": 59919
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node13.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.649Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.859Z", 
+        "amount": 0.112, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 677
-    "model": "core.node", 
+    "pk": 59920
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node14.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.757Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.867Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 678
-    "model": "core.node", 
+    "pk": 59921
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node15.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.865Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.875Z", 
+        "amount": 0.308, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 679
-    "model": "core.node", 
+    "pk": 59922
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node16.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:27.972Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.884Z", 
+        "amount": 0.1176, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 59923, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:28.080Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.892Z", 
+        "amount": 0.2016, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 680
-    "model": "core.node", 
+    "pk": 59924
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node17.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.188Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.900Z", 
+        "amount": 0.1512, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 681
-    "model": "core.node", 
+    "pk": 59925
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node18.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.296Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.909Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 682
-    "model": "core.node", 
+    "pk": 59926
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node19.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.403Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.917Z", 
+        "amount": 0.308, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 683
-    "model": "core.node", 
+    "pk": 59927
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node20.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.511Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.925Z", 
+        "amount": 0.2856, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 684
-    "model": "core.node", 
+    "pk": 59928
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node21.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.619Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.934Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 685
-    "model": "core.node", 
+    "pk": 59929
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node22.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.726Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.942Z", 
+        "amount": 0.2856, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 686
-    "model": "core.node", 
+    "pk": 59930
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node23.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.834Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.950Z", 
+        "amount": 0.1456, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 687
-    "model": "core.node", 
+    "pk": 59931
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node24.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:28.942Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:01.980Z", 
+        "amount": 0.3136, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 688
-    "model": "core.node", 
+    "pk": 59932
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node25.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:29.049Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.021Z", 
+        "amount": 0.1232, 
+        "object": 105, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 689
-    "model": "core.node", 
+    "pk": 59933
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node26.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.066Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.066Z", 
+        "amount": 0.2072, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.96, 
+        "invoice": null, 
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 690
-    "model": "core.node", 
+    "pk": 59934
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node27.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.116Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.116Z", 
+        "amount": 0.2408, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.44, 
+        "invoice": null, 
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 691
-    "model": "core.node", 
+    "pk": 59935
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node28.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.124Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.124Z", 
+        "amount": 0.2352, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.36, 
+        "invoice": null, 
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 692
-    "model": "core.node", 
+    "pk": 59936
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node29.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.132Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.132Z", 
+        "amount": 0.2576, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.68, 
+        "invoice": null, 
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 693
-    "model": "core.node", 
+    "pk": 59937
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node30.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.141Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.141Z", 
+        "amount": 0.2744, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.92, 
+        "invoice": null, 
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 694
-    "model": "core.node", 
+    "pk": 59938
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node31.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.149Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.149Z", 
+        "amount": 0.14, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.0, 
+        "invoice": null, 
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 695
-    "model": "core.node", 
+    "pk": 59939
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node32.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.157Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.157Z", 
+        "amount": 0.2688, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.84, 
+        "invoice": null, 
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 696
-    "model": "core.node", 
+    "pk": 59940
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node33.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:02.165Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.165Z", 
+        "amount": 0.3192, 
+        "object": 105, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.56, 
+        "invoice": null, 
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 697
-    "model": "core.node", 
+    "pk": 59941
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node34.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.210Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.205Z", 
+        "amount": 0.1624, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 698
-    "model": "core.node", 
+    "pk": 59942
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node35.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.318Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.246Z", 
+        "amount": 0.196, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 699
-    "model": "core.node", 
+    "pk": 59943
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node36.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.426Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.273Z", 
+        "amount": 0.3136, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 700
-    "model": "core.node", 
+    "pk": 59944
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node37.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.533Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.323Z", 
+        "amount": 0.1288, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 701
-    "model": "core.node", 
+    "pk": 59945
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node38.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.641Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.348Z", 
+        "amount": 0.28, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 702
-    "model": "core.node", 
+    "pk": 59946
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node39.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.749Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.379Z", 
+        "amount": 0.2688, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 703
-    "model": "core.node", 
+    "pk": 59947
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node40.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.857Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.430Z", 
+        "amount": 0.1792, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 704
-    "model": "core.node", 
+    "pk": 59948
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node41.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:20.964Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.471Z", 
+        "amount": 0.1736, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 705
-    "model": "core.node", 
+    "pk": 59949
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node42.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.072Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.497Z", 
+        "amount": 0.1176, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 706
-    "model": "core.node", 
+    "pk": 59950
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node43.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.180Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.505Z", 
+        "amount": 0.2576, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 707
-    "model": "core.node", 
+    "pk": 59951
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node44.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.287Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.513Z", 
+        "amount": 0.1904, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 708
-    "model": "core.node", 
+    "pk": 59952
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node45.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.395Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.521Z", 
+        "amount": 0.3136, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 709
-    "model": "core.node", 
+    "pk": 59953
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node46.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.503Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.530Z", 
+        "amount": 0.3192, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 710
-    "model": "core.node", 
+    "pk": 59954
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node47.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.610Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.538Z", 
+        "amount": 0.3248, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 711
-    "model": "core.node", 
+    "pk": 59955
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node48.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.718Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.546Z", 
+        "amount": 0.3304, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 712
-    "model": "core.node", 
+    "pk": 59956
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node49.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.826Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.555Z", 
+        "amount": 0.2744, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 713
-    "model": "core.node", 
+    "pk": 59957
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node50.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:21.933Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.563Z", 
+        "amount": 0.168, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 714
-    "model": "core.node", 
+    "pk": 59958
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node51.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.041Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.571Z", 
+        "amount": 0.28, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 715
-    "model": "core.node", 
+    "pk": 59959
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node52.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.149Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.579Z", 
+        "amount": 0.14, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 716
-    "model": "core.node", 
+    "pk": 59960
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node53.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.265Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.588Z", 
+        "amount": 0.3248, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 717
-    "model": "core.node", 
+    "pk": 59961
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node54.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.372Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.596Z", 
+        "amount": 0.2464, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 718
-    "model": "core.node", 
+    "pk": 59962
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node55.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.480Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.604Z", 
+        "amount": 0.1232, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 719
-    "model": "core.node", 
+    "pk": 59963
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node56.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.629Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.613Z", 
+        "amount": 0.1792, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 720
-    "model": "core.node", 
+    "pk": 59964
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node57.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.737Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.621Z", 
+        "amount": 0.336, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 59965, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:22.845Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.629Z", 
+        "amount": 0.2632, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 721
-    "model": "core.node", 
+    "pk": 59966
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node58.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:22.952Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.638Z", 
+        "amount": 0.168, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 722
-    "model": "core.node", 
+    "pk": 59967
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node59.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.060Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.646Z", 
+        "amount": 0.3192, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 723
-    "model": "core.node", 
+    "pk": 59968
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node60.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.168Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.654Z", 
+        "amount": 0.3304, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 724
-    "model": "core.node", 
+    "pk": 59969
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node61.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.275Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.662Z", 
+        "amount": 0.2744, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 725
-    "model": "core.node", 
+    "pk": 59970
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node62.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.383Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.671Z", 
+        "amount": 0.2016, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 726
-    "model": "core.node", 
+    "pk": 59971
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node63.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.491Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.679Z", 
+        "amount": 0.196, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 727
-    "model": "core.node", 
+    "pk": 59972
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node64.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.598Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.687Z", 
+        "amount": 0.3136, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 728
-    "model": "core.node", 
+    "pk": 59973
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node65.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.706Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.695Z", 
+        "amount": 0.3192, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 729
-    "model": "core.node", 
+    "pk": 59974
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node66.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.814Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.704Z", 
+        "amount": 0.3192, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 730
-    "model": "core.node", 
+    "pk": 59975
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node67.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:23.922Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.712Z", 
+        "amount": 0.2464, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 731
-    "model": "core.node", 
+    "pk": 59976
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node68.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.029Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.720Z", 
+        "amount": 0.2912, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 732
-    "model": "core.node", 
+    "pk": 59977
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node69.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.137Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.729Z", 
+        "amount": 0.2016, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 733
-    "model": "core.node", 
+    "pk": 59978
+    "model": "core.charge", 
     "fields": {
-        "site": 12, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
-        "name": "node70.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.245Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.737Z", 
+        "amount": 0.2128, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 734
-    "model": "core.node", 
+    "pk": 59979
+    "model": "core.charge", 
     "fields": {
-        "site": 13, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.atla.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.352Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.745Z", 
+        "amount": 0.1288, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 735
-    "model": "core.node", 
+    "pk": 59980
+    "model": "core.charge", 
     "fields": {
-        "site": 13, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.atla.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.460Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.753Z", 
+        "amount": 0.2408, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 736
-    "model": "core.node", 
+    "pk": 59981
+    "model": "core.charge", 
     "fields": {
-        "site": 14, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.chic.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.576Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.762Z", 
+        "amount": 0.2856, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 737
-    "model": "core.node", 
+    "pk": 59982
+    "model": "core.charge", 
     "fields": {
-        "site": 14, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.chic.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.684Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.770Z", 
+        "amount": 0.2688, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 738
-    "model": "core.node", 
+    "pk": 59983
+    "model": "core.charge", 
     "fields": {
-        "site": 15, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.hous.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.791Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.778Z", 
+        "amount": 0.2072, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 739
-    "model": "core.node", 
+    "pk": 59984
+    "model": "core.charge", 
     "fields": {
-        "site": 15, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.hous.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:24.899Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.787Z", 
+        "amount": 0.224, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 740
-    "model": "core.node", 
+    "pk": 59985
+    "model": "core.charge", 
     "fields": {
-        "site": 16, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.kans.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.007Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.795Z", 
+        "amount": 0.3304, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 741
-    "model": "core.node", 
+    "pk": 59986
+    "model": "core.charge", 
     "fields": {
-        "site": 16, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.kans.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.114Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.803Z", 
+        "amount": 0.224, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 742
-    "model": "core.node", 
+    "pk": 59987
+    "model": "core.charge", 
     "fields": {
-        "site": 17, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.losa.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.222Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.811Z", 
+        "amount": 0.2576, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 743
-    "model": "core.node", 
+    "pk": 59988
+    "model": "core.charge", 
     "fields": {
-        "site": 17, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.losa.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.330Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.820Z", 
+        "amount": 0.2352, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 744
-    "model": "core.node", 
+    "pk": 59989
+    "model": "core.charge", 
     "fields": {
-        "site": 18, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.newy.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.438Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.828Z", 
+        "amount": 0.308, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 745
-    "model": "core.node", 
+    "pk": 59990
+    "model": "core.charge", 
     "fields": {
-        "site": 18, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.newy.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.545Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.836Z", 
+        "amount": 0.3136, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 746
-    "model": "core.node", 
+    "pk": 59991
+    "model": "core.charge", 
     "fields": {
-        "site": 19, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.salt.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.653Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.845Z", 
+        "amount": 0.224, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 747
-    "model": "core.node", 
+    "pk": 59992
+    "model": "core.charge", 
     "fields": {
-        "site": 19, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.salt.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.761Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.853Z", 
+        "amount": 0.308, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 748
-    "model": "core.node", 
+    "pk": 59993
+    "model": "core.charge", 
     "fields": {
-        "site": 20, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.seat.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.868Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.861Z", 
+        "amount": 0.2688, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 749
-    "model": "core.node", 
+    "pk": 59994
+    "model": "core.charge", 
     "fields": {
-        "site": 20, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.seat.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:25.976Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.869Z", 
+        "amount": 0.2464, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 750
-    "model": "core.node", 
+    "pk": 59995
+    "model": "core.charge", 
     "fields": {
-        "site": 21, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node1.wash.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.084Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.878Z", 
+        "amount": 0.3024, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 751
-    "model": "core.node", 
+    "pk": 59996
+    "model": "core.charge", 
     "fields": {
-        "site": 21, 
-        "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
-        "name": "node2.wash.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "updated": "2013-12-18T21:29:26.192Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.886Z", 
+        "amount": 0.1456, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 752
-    "model": "core.node", 
+    "pk": 59997
+    "model": "core.charge", 
     "fields": {
-        "site": 23, 
-        "updated": "2013-12-17T17:10:48.740Z", 
-        "deployment": 10, 
-        "name": "opencloud0.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.740Z"
+        "updated": "2013-12-18T21:29:26.299Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.894Z", 
+        "amount": 0.2968, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 753
-    "model": "core.node", 
+    "pk": 59998
+    "model": "core.charge", 
     "fields": {
-        "site": 23, 
-        "updated": "2013-12-17T17:10:48.742Z", 
-        "deployment": 10, 
-        "name": "opencloud1.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.741Z"
+        "updated": "2013-12-18T21:29:26.407Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.902Z", 
+        "amount": 0.1344, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 754
-    "model": "core.node", 
+    "pk": 59999
+    "model": "core.charge", 
     "fields": {
-        "site": 23, 
-        "updated": "2013-12-17T17:10:48.742Z", 
-        "deployment": 10, 
-        "name": "opencloud2.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.742Z"
+        "updated": "2013-12-18T21:29:26.514Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.911Z", 
+        "amount": 0.3192, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 755
-    "model": "core.node", 
+    "pk": 60000
+    "model": "core.charge", 
     "fields": {
-        "site": 23, 
-        "updated": "2013-12-17T17:10:48.743Z", 
-        "deployment": 10, 
-        "name": "opencloud3.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.743Z"
+        "updated": "2013-12-18T21:29:26.622Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.919Z", 
+        "amount": 0.1288, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 4
-    "model": "core.serviceresource", 
+    "pk": 60001
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-11T22:18:00.040Z", 
-        "name": "Cycles", 
-        "bucketMaxSize": 0, 
-        "created": "2013-12-11T22:18:00.040Z", 
-        "serviceClass": 1, 
-        "maxUnitsDeployment": 0, 
-        "bucketInRate": 0, 
-        "cost": 7, 
-        "calendarReservable": false, 
-        "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "updated": "2013-12-18T21:29:26.730Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.927Z", 
+        "amount": 0.2968, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 5
-    "model": "core.serviceresource", 
+    "pk": 60002
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-11T22:18:00.045Z", 
-        "name": "Cycles", 
-        "bucketMaxSize": 0, 
-        "created": "2013-12-11T22:18:00.045Z", 
-        "serviceClass": 2, 
-        "maxUnitsDeployment": 0, 
-        "bucketInRate": 0, 
-        "cost": 7, 
-        "calendarReservable": false, 
-        "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "updated": "2013-12-18T21:29:26.846Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.936Z", 
+        "amount": 0.1848, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 6, 
-    "model": "core.serviceresource", 
+    "pk": 60003
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-11T22:18:00.053Z", 
-        "name": "Cycles", 
-        "bucketMaxSize": 0, 
-        "created": "2013-12-11T22:18:00.053Z", 
-        "serviceClass": 3, 
-        "maxUnitsDeployment": 0, 
-        "bucketInRate": 0, 
-        "cost": 7, 
-        "calendarReservable": false, 
-        "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "updated": "2013-12-18T21:29:26.953Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.944Z", 
+        "amount": 0.1568, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.24, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 7
-    "model": "core.serviceresource", 
+    "pk": 60004
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-11T22:18:00.064Z", 
-        "name": "numberCores", 
-        "bucketMaxSize": 0, 
-        "created": "2013-12-11T22:18:00.064Z", 
-        "serviceClass": 3, 
-        "maxUnitsDeployment": 210, 
-        "bucketInRate": 0, 
-        "cost": 0, 
-        "calendarReservable": true, 
-        "maxDuration": 8760, 
-        "maxUnitsNode": 6
+        "updated": "2013-12-18T21:29:27.061Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.952Z", 
+        "amount": 0.1736, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 8
-    "model": "core.serviceresource", 
+    "pk": 60005
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-11T22:18:00.072Z", 
-        "name": "numberCores", 
-        "bucketMaxSize": 210, 
-        "created": "2013-12-11T22:18:00.072Z", 
-        "serviceClass": 2, 
-        "maxUnitsDeployment": 210, 
-        "bucketInRate": 10, 
-        "cost": 7, 
-        "calendarReservable": true, 
-        "maxDuration": 168, 
-        "maxUnitsNode": 6
+        "updated": "2013-12-18T21:29:27.169Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:02.960Z", 
+        "amount": 0.3024, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 40
-    "model": "core.sliver", 
+    "pk": 60006
+    "model": "core.charge", 
     "fields": {
-        "node": 613, 
-        "instance_name": "instance-000003e8", 
-        "updated": "2013-12-12T17:55:32.455Z", 
+        "updated": "2013-12-18T21:29:27.277Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node20.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.455Z", 
-        "ip": "130.207.98.29", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:02.969Z", 
+        "amount": 0.2128, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 41
-    "model": "core.sliver", 
+    "pk": 60007
+    "model": "core.charge", 
     "fields": {
-        "node": 615, 
-        "instance_name": "instance-000003e9", 
-        "updated": "2013-12-12T17:55:32.478Z", 
+        "updated": "2013-12-18T21:29:27.384Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node22.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.478Z", 
-        "ip": "130.207.98.31", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:02.977Z", 
+        "amount": 0.168, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 42
-    "model": "core.sliver", 
+    "pk": 60008
+    "model": "core.charge", 
     "fields": {
-        "node": 617, 
-        "instance_name": "instance-000003ea", 
-        "updated": "2013-12-12T17:55:32.495Z", 
+        "updated": "2013-12-18T21:29:27.492Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node24.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.495Z", 
-        "ip": "130.207.98.33", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:02.985Z", 
+        "amount": 0.2968, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 43
-    "model": "core.sliver", 
+    "pk": 60009
+    "model": "core.charge", 
     "fields": {
-        "node": 622, 
-        "instance_name": "instance-000003eb", 
-        "updated": "2013-12-12T17:55:32.512Z", 
+        "updated": "2013-12-18T21:29:27.658Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node29.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.511Z", 
-        "ip": "130.207.98.38", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:02.994Z", 
+        "amount": 0.14, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 44
-    "model": "core.sliver", 
+    "pk": 60010
+    "model": "core.charge", 
     "fields": {
-        "node": 623, 
-        "instance_name": "instance-000003ec", 
-        "updated": "2013-12-12T17:55:32.528Z", 
+        "updated": "2013-12-18T21:29:27.765Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node30.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.528Z", 
-        "ip": "130.207.98.39", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.002Z", 
+        "amount": 0.252, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.6, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 45
-    "model": "core.sliver", 
+    "pk": 60011
+    "model": "core.charge", 
     "fields": {
-        "node": 624, 
-        "instance_name": "instance-000003ed", 
-        "updated": "2013-12-12T17:55:32.544Z", 
+        "updated": "2013-12-18T21:29:27.873Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node31.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.544Z", 
-        "ip": "130.207.98.40", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.010Z", 
+        "amount": 0.2744, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 46
-    "model": "core.sliver", 
+    "pk": 60012
+    "model": "core.charge", 
     "fields": {
-        "node": 625, 
-        "instance_name": "instance-000003ee", 
-        "updated": "2013-12-12T17:55:32.561Z", 
+        "updated": "2013-12-18T21:29:27.981Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node32.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.561Z", 
-        "ip": "130.207.98.41", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.018Z", 
+        "amount": 0.196, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 47
-    "model": "core.sliver", 
+    "pk": 60013
+    "model": "core.charge", 
     "fields": {
-        "node": 630, 
-        "instance_name": "instance-000003ef", 
-        "updated": "2013-12-12T17:55:32.577Z", 
+        "updated": "2013-12-18T21:29:28.088Z", 
         "slice": 4, 
-        "deploymentNetwork": 8, 
-        "name": "node37.gt.vicci.org", 
-        "created": "2013-12-12T17:55:32.577Z", 
-        "ip": "130.207.98.46", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.027Z", 
+        "amount": 0.168, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 48
-    "model": "core.sliver", 
+    "pk": 60014
+    "model": "core.charge", 
     "fields": {
-        "node": 666, 
-        "instance_name": "instance-000003f0", 
-        "updated": "2013-12-12T17:55:32.594Z", 
+        "updated": "2013-12-18T21:29:28.196Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node3.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.594Z", 
-        "ip": "141.39.220.13", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.035Z", 
+        "amount": 0.1176, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 49
-    "model": "core.sliver", 
+    "pk": 60015
+    "model": "core.charge", 
     "fields": {
-        "node": 683, 
-        "instance_name": "instance-000003f1", 
-        "updated": "2013-12-12T17:55:32.611Z", 
+        "updated": "2013-12-18T21:29:28.304Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node20.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.610Z", 
-        "ip": "141.39.220.30", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.043Z", 
+        "amount": 0.3248, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 50
-    "model": "core.sliver", 
+    "pk": 60016
+    "model": "core.charge", 
     "fields": {
-        "node": 684, 
-        "instance_name": "instance-000003f2", 
-        "updated": "2013-12-12T17:55:32.627Z", 
+        "updated": "2013-12-18T21:29:28.411Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node21.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.627Z", 
-        "ip": "141.39.220.31", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.052Z", 
+        "amount": 0.1792, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 51
-    "model": "core.sliver", 
+    "pk": 60017
+    "model": "core.charge", 
     "fields": {
-        "node": 686, 
-        "instance_name": "instance-000003f3", 
-        "updated": "2013-12-12T17:55:32.644Z", 
+        "updated": "2013-12-18T21:29:28.519Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node23.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.644Z", 
-        "ip": "141.39.220.33", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.060Z", 
+        "amount": 0.1232, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 52
-    "model": "core.sliver", 
+    "pk": 60018
+    "model": "core.charge", 
     "fields": {
-        "node": 687, 
-        "instance_name": "instance-000003f4", 
-        "updated": "2013-12-12T17:55:32.660Z", 
+        "updated": "2013-12-18T21:29:28.627Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node24.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.660Z", 
-        "ip": "141.39.220.34", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.068Z", 
+        "amount": 0.1512, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 53
-    "model": "core.sliver", 
+    "pk": 60019
+    "model": "core.charge", 
     "fields": {
-        "node": 691, 
-        "instance_name": "instance-000003f5", 
-        "updated": "2013-12-12T17:55:32.677Z", 
+        "updated": "2013-12-18T21:29:28.735Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node28.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.677Z", 
-        "ip": "141.39.220.38", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.076Z", 
+        "amount": 0.3024, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 54
-    "model": "core.sliver", 
-    "fields": {
-        "node": 693
-        "instance_name": "instance-000003f6"
-        "updated": "2013-12-12T17:55:32.693Z", 
-        "slice": 4
-        "deploymentNetwork": 9
-        "name": "node30.mpisws.vicci.org"
-        "created": "2013-12-12T17:55:32.693Z", 
-        "ip": "141.39.220.40"
-        "image": 1
-        "creator": 8
-        "numberCores": 1
-        "instance_id": null
+    "pk": 60020
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:28.842Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.085Z", 
+        "amount": 0.1792
+        "object": 106
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 2.56
+        "invoice": 72
+        "date": "2013-12-15T05:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 55
-    "model": "core.sliver", 
+    "pk": 60021
+    "model": "core.charge", 
     "fields": {
-        "node": 694, 
-        "instance_name": "instance-000003f7", 
-        "updated": "2013-12-12T17:55:32.710Z", 
+        "updated": "2013-12-18T21:29:28.950Z", 
         "slice": 4, 
-        "deploymentNetwork": 9, 
-        "name": "node31.mpisws.vicci.org", 
-        "created": "2013-12-12T17:55:32.710Z", 
-        "ip": "141.39.220.41", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.093Z", 
+        "amount": 0.1512, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 56
-    "model": "core.sliver", 
+    "pk": 60022
+    "model": "core.charge", 
     "fields": {
-        "node": 559, 
-        "instance_name": "instance-000003f8", 
-        "updated": "2013-12-12T17:55:32.726Z", 
+        "updated": "2013-12-18T21:29:29.058Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node36.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.726Z", 
-        "ip": "128.112.171.90", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.101Z", 
+        "amount": 0.2016, 
+        "object": 106, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 57
-    "model": "core.sliver", 
+    "pk": 60023
+    "model": "core.charge", 
     "fields": {
-        "node": 560, 
-        "instance_name": "instance-000003f9", 
-        "updated": "2013-12-12T17:55:32.743Z", 
+        "updated": "2013-12-18T21:29:03.110Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node37.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.743Z", 
-        "ip": "128.112.171.92", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.110Z", 
+        "amount": 0.2408, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.44, 
+        "invoice": null, 
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58
-    "model": "core.sliver", 
+    "pk": 60024
+    "model": "core.charge", 
     "fields": {
-        "node": 561, 
-        "instance_name": "instance-000003fa", 
-        "updated": "2013-12-12T17:55:32.760Z", 
+        "updated": "2013-12-18T21:29:03.118Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node38.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.759Z", 
-        "ip": "128.112.171.94", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.118Z", 
+        "amount": 0.2184, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.12, 
+        "invoice": null, 
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59
-    "model": "core.sliver", 
+    "pk": 60025
+    "model": "core.charge", 
     "fields": {
-        "node": 562, 
-        "instance_name": "instance-000003fb", 
-        "updated": "2013-12-12T17:55:32.776Z", 
+        "updated": "2013-12-18T21:29:03.126Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node39.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.776Z", 
-        "ip": "128.112.171.96", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.126Z", 
+        "amount": 0.1904, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.72, 
+        "invoice": null, 
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 60, 
-    "model": "core.sliver", 
+    "pk": 60026
+    "model": "core.charge", 
     "fields": {
-        "node": 563, 
-        "instance_name": "instance-000003fc", 
-        "updated": "2013-12-12T17:55:32.792Z", 
+        "updated": "2013-12-18T21:29:03.134Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node40.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.792Z", 
-        "ip": "128.112.171.98", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.134Z", 
+        "amount": 0.2464, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.52, 
+        "invoice": null, 
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 61
-    "model": "core.sliver", 
+    "pk": 60027
+    "model": "core.charge", 
     "fields": {
-        "node": 565, 
-        "instance_name": "instance-000003fd", 
-        "updated": "2013-12-12T17:55:32.809Z", 
+        "updated": "2013-12-18T21:29:03.143Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node42.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.809Z", 
-        "ip": "128.112.171.102", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.143Z", 
+        "amount": 0.2408, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.44, 
+        "invoice": null, 
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 62
-    "model": "core.sliver", 
+    "pk": 60028
+    "model": "core.charge", 
     "fields": {
-        "node": 566, 
-        "instance_name": "instance-000003fe", 
-        "updated": "2013-12-12T17:55:32.826Z", 
+        "updated": "2013-12-18T21:29:03.151Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node43.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.826Z", 
-        "ip": "128.112.171.104", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.151Z", 
+        "amount": 0.196, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.8, 
+        "invoice": null, 
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 63
-    "model": "core.sliver", 
+    "pk": 60029
+    "model": "core.charge", 
     "fields": {
-        "node": 568, 
-        "instance_name": "instance-000003ff", 
-        "updated": "2013-12-12T17:55:32.842Z", 
+        "updated": "2013-12-18T21:29:03.160Z", 
         "slice": 4, 
-        "deploymentNetwork": 7, 
-        "name": "node45.princeton.vicci.org", 
-        "created": "2013-12-12T17:55:32.842Z", 
-        "ip": "128.112.171.108", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.159Z", 
+        "amount": 0.2632, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.76, 
+        "invoice": null, 
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 64
-    "model": "core.sliver", 
+    "pk": 60030
+    "model": "core.charge", 
     "fields": {
-        "node": 404, 
-        "instance_name": "instance-00000400", 
-        "updated": "2013-12-12T17:55:32.859Z", 
+        "updated": "2013-12-18T21:29:03.168Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node21.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.859Z", 
-        "ip": "171.67.92.159", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.168Z", 
+        "amount": 0.1176, 
+        "object": 106, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 1.68, 
+        "invoice": null, 
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 65
-    "model": "core.sliver", 
+    "pk": 60031
+    "model": "core.charge", 
     "fields": {
-        "node": 405, 
-        "instance_name": "instance-00000401", 
-        "updated": "2013-12-12T17:55:32.875Z", 
+        "updated": "2013-12-18T21:29:20.219Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node22.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.875Z", 
-        "ip": "171.67.92.160", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.183Z", 
+        "amount": 0.112, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 66
-    "model": "core.sliver", 
+    "pk": 60032
+    "model": "core.charge", 
     "fields": {
-        "node": 406, 
-        "instance_name": "instance-00000402", 
-        "updated": "2013-12-12T17:55:32.892Z", 
+        "updated": "2013-12-18T21:29:20.326Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node23.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.892Z", 
-        "ip": "171.67.92.161", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.193Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 67
-    "model": "core.sliver", 
+    "pk": 60033
+    "model": "core.charge", 
     "fields": {
-        "node": 407, 
-        "instance_name": "instance-00000403", 
-        "updated": "2013-12-12T17:55:32.909Z", 
+        "updated": "2013-12-18T21:29:20.434Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node24.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.909Z", 
-        "ip": "171.67.92.162", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.201Z", 
+        "amount": 0.3248, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 68
-    "model": "core.sliver", 
+    "pk": 60034
+    "model": "core.charge", 
     "fields": {
-        "node": 408, 
-        "instance_name": "instance-00000404", 
-        "updated": "2013-12-12T17:55:32.925Z", 
+        "updated": "2013-12-18T21:29:20.542Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node25.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.925Z", 
-        "ip": "171.67.92.163", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.209Z", 
+        "amount": 0.2296, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 69
-    "model": "core.sliver", 
+    "pk": 60035
+    "model": "core.charge", 
     "fields": {
-        "node": 409, 
-        "instance_name": "instance-00000405", 
-        "updated": "2013-12-12T17:55:32.942Z", 
+        "updated": "2013-12-18T21:29:20.650Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node26.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.942Z", 
-        "ip": "171.67.92.164", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.217Z", 
+        "amount": 0.2912, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 70
-    "model": "core.sliver", 
+    "pk": 60036
+    "model": "core.charge", 
     "fields": {
-        "node": 412, 
-        "instance_name": "instance-00000406", 
-        "updated": "2013-12-12T17:55:32.958Z", 
+        "updated": "2013-12-18T21:29:20.757Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node29.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.958Z", 
-        "ip": "171.67.92.167", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.226Z", 
+        "amount": 0.2016, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 71
-    "model": "core.sliver", 
+    "pk": 60037
+    "model": "core.charge", 
     "fields": {
-        "node": 413, 
-        "instance_name": "instance-00000407", 
-        "updated": "2013-12-12T17:55:32.975Z", 
+        "updated": "2013-12-18T21:29:20.865Z", 
         "slice": 4, 
-        "deploymentNetwork": 5, 
-        "name": "node30.stanford.vicci.org", 
-        "created": "2013-12-12T17:55:32.975Z", 
-        "ip": "171.67.92.168", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.234Z", 
+        "amount": 0.1736, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 72
-    "model": "core.sliver", 
+    "pk": 60038
+    "model": "core.charge", 
     "fields": {
-        "node": 460, 
-        "instance_name": "instance-00000408", 
-        "updated": "2013-12-12T17:55:32.992Z", 
+        "updated": "2013-12-18T21:29:20.973Z", 
         "slice": 4, 
-        "deploymentNetwork": 6, 
-        "name": "node7.washington.vicci.org", 
-        "created": "2013-12-12T17:55:32.992Z", 
-        "ip": "128.95.1.112", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.242Z", 
+        "amount": 0.1456, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 73
-    "model": "core.sliver", 
+    "pk": 60039
+    "model": "core.charge", 
     "fields": {
-        "node": 467, 
-        "instance_name": "instance-00000409", 
-        "updated": "2013-12-12T17:55:33.008Z", 
+        "updated": "2013-12-18T21:29:21.080Z", 
         "slice": 4, 
-        "deploymentNetwork": 6, 
-        "name": "node14.washington.vicci.org", 
-        "created": "2013-12-12T17:55:33.008Z", 
-        "ip": "128.95.1.119", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.251Z", 
+        "amount": 0.1568, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.24, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 74
-    "model": "core.sliver", 
+    "pk": 60040
+    "model": "core.charge", 
     "fields": {
-        "node": 468, 
-        "instance_name": "instance-0000040a", 
-        "updated": "2013-12-12T17:55:33.025Z", 
+        "updated": "2013-12-18T21:29:21.188Z", 
         "slice": 4, 
-        "deploymentNetwork": 6, 
-        "name": "node15.washington.vicci.org", 
-        "created": "2013-12-12T17:55:33.025Z", 
-        "ip": "128.95.1.120", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.259Z", 
+        "amount": 0.224, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 75
-    "model": "core.sliver", 
+    "pk": 60041
+    "model": "core.charge", 
     "fields": {
-        "node": 469, 
-        "instance_name": "instance-0000040b", 
-        "updated": "2013-12-12T17:55:33.041Z", 
+        "updated": "2013-12-18T21:29:21.296Z", 
         "slice": 4, 
-        "deploymentNetwork": 6, 
-        "name": "node16.washington.vicci.org", 
-        "created": "2013-12-12T17:55:33.041Z", 
-        "ip": "128.95.1.121", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.267Z", 
+        "amount": 0.1176, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 76
-    "model": "core.sliver", 
+    "pk": 60042
+    "model": "core.charge", 
     "fields": {
-        "node": 470, 
-        "instance_name": "instance-0000040c", 
-        "updated": "2013-12-12T17:55:33.058Z", 
+        "updated": "2013-12-18T21:29:21.403Z", 
         "slice": 4, 
-        "deploymentNetwork": 6, 
-        "name": "node17.washington.vicci.org", 
-        "created": "2013-12-12T17:55:33.058Z", 
-        "ip": "128.95.1.122", 
-        "image": 1, 
-        "creator": 8, 
-        "numberCores": 1, 
-        "instance_id": null
+        "created": "2013-12-18T21:29:03.275Z", 
+        "amount": 0.2856, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 77
-    "model": "core.sliver", 
+    "pk": 60043
+    "model": "core.charge", 
     "fields": {
-        "node": 553
-        "instance_name": "instance-0000040d"
-        "updated": "2013-12-12T17:55:33.110Z", 
-        "slice": 8
-        "deploymentNetwork": 7, 
-        "name": "node30.princeton.vicci.org"
-        "created": "2013-12-12T17:55:33.110Z", 
-        "ip": "128.112.171.78"
-        "image": 1
-        "creator": 8
-        "numberCores": 1
-        "instance_id": null
+        "updated": "2013-12-18T21:29:21.511Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.284Z", 
+        "amount": 0.3192
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 4.56
+        "invoice": 69
+        "date": "2013-11-22T21:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 78
-    "model": "core.sliver", 
+    "pk": 60044
+    "model": "core.charge", 
     "fields": {
-        "node": 553
-        "instance_name": "instance-0000040e"
-        "updated": "2013-12-12T17:55:33.142Z", 
-        "slice": 9
-        "deploymentNetwork": 7, 
-        "name": "node30.princeton.vicci.org"
-        "created": "2013-12-12T17:55:33.142Z", 
-        "ip": "128.112.171.78"
-        "image": 1
-        "creator": 8
-        "numberCores": 1
-        "instance_id": null
+        "updated": "2013-12-18T21:29:21.619Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.292Z", 
+        "amount": 0.1736
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 2.48
+        "invoice": 69
+        "date": "2013-11-23T05:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 79
-    "model": "core.sliver", 
+    "pk": 60045
+    "model": "core.charge", 
     "fields": {
-        "node": 469
-        "instance_name": null
-        "updated": "2013-12-13T21:51:36.927Z", 
-        "slice": 11
-        "deploymentNetwork": 6
-        "name": "Stork"
-        "created": "2013-12-13T21:51:36.927Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:21.726Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.300Z", 
+        "amount": 0.2352
+        "object": 107
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 3.36
+        "invoice": 69
+        "date": "2013-11-23T13:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 80
-    "model": "core.sliver", 
+    "pk": 60046
+    "model": "core.charge", 
     "fields": {
-        "node": 438
-        "instance_name": null
-        "updated": "2013-12-13T21:53:35.001Z", 
-        "slice": 12
-        "deploymentNetwork": 5
-        "name": "Owl"
-        "created": "2013-12-13T21:53:35.001Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:21.834Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.308Z", 
+        "amount": 0.1736
+        "object": 107
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 2.48
+        "invoice": 69
+        "date": "2013-11-23T21:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 81
-    "model": "core.sliver", 
+    "pk": 60047
+    "model": "core.charge", 
     "fields": {
-        "node": 546
-        "instance_name": null
-        "updated": "2013-12-13T21:58:13.897Z", 
-        "slice": 14
-        "deploymentNetwork": 7, 
-        "name": "test-slice-1"
-        "created": "2013-12-13T21:58:13.897Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:21.942Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.317Z", 
+        "amount": 0.2128
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 3.04
+        "invoice": 69
+        "date": "2013-11-24T05:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 82
-    "model": "core.sliver", 
+    "pk": 60048
+    "model": "core.charge", 
     "fields": {
-        "node": 538
-        "instance_name": null
-        "updated": "2013-12-13T21:58:44.349Z", 
-        "slice": 14
-        "deploymentNetwork": 7, 
-        "name": "test-slice-1"
-        "created": "2013-12-13T21:58:44.349Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.049Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.325Z", 
+        "amount": 0.2968
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 4.24
+        "invoice": 69
+        "date": "2013-11-24T13:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 83
-    "model": "core.sliver", 
-    "fields": {
-        "node": 556
-        "instance_name": null
-        "updated": "2013-12-13T21:58:44.350Z", 
-        "slice": 14
-        "deploymentNetwork": 7, 
-        "name": "test-slice-1"
-        "created": "2013-12-13T21:58:44.350Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+    "pk": 60049
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:22.157Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.333Z", 
+        "amount": 0.1176
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 1.68
+        "invoice": 69
+        "date": "2013-11-24T21:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 84
-    "model": "core.sliver", 
+    "pk": 60050
+    "model": "core.charge", 
     "fields": {
-        "node": 384
-        "instance_name": null
-        "updated": "2013-12-13T21:59:36.723Z", 
-        "slice": 13
-        "deploymentNetwork": 5
-        "name": "Hadoop"
-        "created": "2013-12-13T21:59:36.723Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.273Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.342Z", 
+        "amount": 0.1792
+        "object": 107
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 2.56
+        "invoice": 70
+        "date": "2013-11-25T05:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 85
-    "model": "core.sliver", 
+    "pk": 60051
+    "model": "core.charge", 
     "fields": {
-        "node": 473
-        "instance_name": null
-        "updated": "2013-12-13T21:59:36.725Z", 
-        "slice": 13
-        "deploymentNetwork": 6
-        "name": "Hadoop"
-        "created": "2013-12-13T21:59:36.725Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.381Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.350Z", 
+        "amount": 0.3304
+        "object": 107
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 4.72
+        "invoice": 70
+        "date": "2013-11-25T13:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 86
-    "model": "core.sliver", 
+    "pk": 60052
+    "model": "core.charge", 
     "fields": {
-        "node": 535
-        "instance_name": null
-        "updated": "2013-12-13T21:59:36.726Z", 
-        "slice": 13
-        "deploymentNetwork": 7, 
-        "name": "Hadoop"
-        "created": "2013-12-13T21:59:36.726Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.488Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.358Z", 
+        "amount": 0.2912
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 4.16
+        "invoice": 70
+        "date": "2013-11-25T21:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 87
-    "model": "core.sliver", 
+    "pk": 60053
+    "model": "core.charge", 
     "fields": {
-        "node": 533
-        "instance_name": null
-        "updated": "2013-12-13T22:01:30.192Z", 
-        "slice": 15
-        "deploymentNetwork": 7, 
-        "name": "test-slice-2"
-        "created": "2013-12-13T22:01:30.192Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.638Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.366Z", 
+        "amount": 0.252
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 3.6
+        "invoice": 70
+        "date": "2013-11-26T05:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 88
-    "model": "core.sliver", 
+    "pk": 60054
+    "model": "core.charge", 
     "fields": {
-        "node": 536
-        "instance_name": null
-        "updated": "2013-12-13T22:01:49.742Z", 
-        "slice": 15
-        "deploymentNetwork": 7, 
-        "name": "test-slice-2"
-        "created": "2013-12-13T22:01:49.742Z", 
-        "ip": null
-        "image": 1
-        "creator": 8
-        "numberCores": 0
-        "instance_id": null
+        "updated": "2013-12-18T21:29:22.745Z"
+        "slice": 4
+        "created": "2013-12-18T21:29:03.375Z", 
+        "amount": 0.3024
+        "object": 107, 
+        "account": 15
+        "state": "invoiced", 
+        "coreHours": 4.32
+        "invoice": 70
+        "date": "2013-11-26T13:00:00Z"
+        "kind": "besteffort"
+        "enacted": null
     }
 },
 {
-    "pk": 1
-    "model": "core.networktemplate", 
+    "pk": 60055
+    "model": "core.charge", 
     "fields": {
-        "guaranteedBandwidth": 0, 
-        "description": "Connect a sliver to the public network using dedicated public IPv4 address", 
-        "created": "2013-12-09T14:15:16.899Z", 
-        "sharedNetworkName": "", 
-        "updated": "2013-12-09T14:15:16.899Z", 
-        "visibility": "private", 
-        "translation": "none", 
-        "sharedNetworkId": "", 
-        "name": "dedicated-public-IPv4"
+        "updated": "2013-12-18T21:29:22.853Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.383Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 2
-    "model": "core.networktemplate", 
+    "pk": 60056
+    "model": "core.charge", 
     "fields": {
-        "guaranteedBandwidth": 0, 
-        "description": "For PlanetLab compatibility: connect to the public network by sharing the node's public IP address.", 
-        "created": "2013-12-09T14:16:12.358Z", 
-        "sharedNetworkName": "", 
-        "updated": "2013-12-09T14:16:12.358Z", 
-        "visibility": "public", 
-        "translation": "none", 
-        "sharedNetworkId": "", 
-        "name": "planetlab-legacy"
+        "updated": "2013-12-18T21:29:22.961Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.391Z", 
+        "amount": 0.308, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 3
-    "model": "core.networktemplate", 
+    "pk": 60057
+    "model": "core.charge", 
     "fields": {
-        "guaranteedBandwidth": 0, 
-        "description": "Connect a sliver to the public network via NAT", 
-        "created": "2013-12-09T14:17:29.551Z", 
-        "sharedNetworkName": "nat-net", 
-        "updated": "2013-12-09T14:17:29.551Z", 
-        "visibility": "private", 
-        "translation": "NAT", 
-        "sharedNetworkId": "51d641ba-9e1e-46f5-8069-bf4a929f851f", 
-        "name": "private-IPv4-plus-NAT"
+        "updated": "2013-12-18T21:29:23.068Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.400Z", 
+        "amount": 0.196, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 4
-    "model": "core.networktemplate", 
+    "pk": 60058
+    "model": "core.charge", 
     "fields": {
-        "guaranteedBandwidth": 0, 
-        "description": "A private virtual network", 
-        "created": "2013-12-09T14:18:02.336Z", 
-        "sharedNetworkName": "", 
-        "updated": "2013-12-09T14:18:02.336Z", 
-        "visibility": "private", 
-        "translation": "none", 
-        "sharedNetworkId": "", 
-        "name": "private-virtual"
+        "updated": "2013-12-18T21:29:23.176Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.408Z", 
+        "amount": 0.1232, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 1
-    "model": "core.network", 
+    "pk": 60059
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.128/28", 
-        "updated": "2013-12-09T14:24:19.970Z", 
-        "subnet_id": "e1796711-5584-4bc1-b09b-45dff8f59f32", 
-        "name": "VINI-I2WashDC-public", 
-        "created": "2013-12-09T14:24:19.970Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "7cb4291d-f8d3-4797-83b0-8deefd85bdf5", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.284Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.416Z", 
+        "amount": 0.3024, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 2
-    "model": "core.network", 
+    "pk": 60060
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.112/28", 
-        "updated": "2013-12-09T14:31:41.605Z", 
-        "subnet_id": "1afdc262-767b-4736-9403-584265293a81", 
-        "name": "VINI-I2Seattle-public", 
-        "created": "2013-12-09T14:31:41.605Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "810b4cb8-9d8e-4eee-becc-676785a07725", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.391Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.424Z", 
+        "amount": 0.2912, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 3
-    "model": "core.network", 
+    "pk": 60061
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.96/28", 
-        "updated": "2013-12-09T14:33:10.312Z", 
-        "subnet_id": "c3582780-76f1-4979-97b0-e27f39f18daa", 
-        "name": "VINI-I2SaltLakeCity-public", 
-        "created": "2013-12-09T14:33:10.312Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "4b37f048-11de-4ddd-acaf-2fc5e8716f0e", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.499Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.433Z", 
+        "amount": 0.1904, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 4
-    "model": "core.network", 
+    "pk": 60062
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.80/28", 
-        "updated": "2013-12-09T14:34:55.754Z", 
-        "subnet_id": "c0d989f2-f42f-4b3e-a23f-a0063ac4f010", 
-        "name": "VINI-I2NewYork-public", 
-        "created": "2013-12-09T14:34:55.754Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "684386d7-1286-4e58-acda-8ff45deac99e", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.607Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.441Z", 
+        "amount": 0.1176, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 5
-    "model": "core.network", 
+    "pk": 60063
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.64/28", 
-        "updated": "2013-12-09T14:36:09.261Z", 
-        "subnet_id": "d37bab1f-7e01-417c-86c4-ea0d69e2f25d", 
-        "name": "VINI-I2LosAngeles-public", 
-        "created": "2013-12-09T14:36:09.261Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "fa090174-ec59-4b7a-812b-9206d911fb61", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.715Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.449Z", 
+        "amount": 0.1456, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 6, 
-    "model": "core.network", 
+    "pk": 60064
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.48/28", 
-        "updated": "2013-12-09T14:37:02.420Z", 
-        "subnet_id": "7caa4cfb-846a-4e4c-9984-8ead4091f816", 
-        "name": "VINI-I2KansasCity-public", 
-        "created": "2013-12-09T14:37:02.420Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "017a3914-5eaf-4bcb-8609-6d17ebcdf075", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.822Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.457Z", 
+        "amount": 0.3136, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 9
-    "model": "core.network", 
+    "pk": 60065
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.32/28", 
-        "updated": "2013-12-09T14:41:00.237Z", 
-        "subnet_id": "4438dfbd-099a-4229-bd86-cf29478a009b", 
-        "name": "VINI-I2Houston-public", 
-        "created": "2013-12-09T14:41:00.237Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:23.930Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.466Z", 
+        "amount": 0.308, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 10
-    "model": "core.network", 
+    "pk": 60066
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.16/28", 
-        "updated": "2013-12-09T14:42:03.158Z", 
-        "subnet_id": "332113b1-e6f4-492e-ad93-ce21512d3459", 
-        "name": "VINI-I2Chicago-public", 
-        "created": "2013-12-09T14:42:03.158Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "ecdbaf66-b659-4d59-b0b7-1bf6d232ccba", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.038Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.474Z", 
+        "amount": 0.252, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.6, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 11
-    "model": "core.network", 
+    "pk": 60067
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "64.57.18.0/28", 
-        "updated": "2013-12-09T14:42:49.781Z", 
-        "subnet_id": "dafefd4f-2622-4987-9f30-94e9a977cfc3", 
-        "name": "VINI-I2Atlanta-public", 
-        "created": "2013-12-09T14:42:49.781Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "ae4d42e8-a97c-440d-9533-4bcbd62dfb00", 
-        "template": 1, 
-        "owner": 10, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.145Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.482Z", 
+        "amount": 0.2856, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 12
-    "model": "core.network", 
+    "pk": 60068
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "", 
-        "updated": "2013-12-13T21:51:04.425Z", 
-        "subnet_id": "", 
-        "name": "Stork package distribution", 
-        "created": "2013-12-13T21:51:04.425Z", 
-        "permitAllSlices": true, 
-        "permittedSlices": [], 
-        "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "", 
-        "template": 4, 
-        "owner": 11, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.253Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.491Z", 
+        "amount": 0.1624, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 13
-    "model": "core.network", 
+    "pk": 60069
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "", 
-        "updated": "2013-12-13T21:53:07.783Z", 
-        "subnet_id": "", 
-        "name": "Owl Data Collection", 
-        "created": "2013-12-13T21:53:07.783Z", 
-        "permitAllSlices": true, 
-        "permittedSlices": [], 
-        "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "", 
-        "template": 4, 
-        "owner": 12, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.361Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.499Z", 
+        "amount": 0.3304, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 14
-    "model": "core.network", 
+    "pk": 60070
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "", 
-        "updated": "2013-12-13T21:55:51.703Z", 
-        "subnet_id": "", 
-        "name": "Hadoop Shared Filesystem Access", 
-        "created": "2013-12-13T21:55:51.703Z", 
-        "permitAllSlices": true, 
-        "permittedSlices": [], 
-        "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "", 
-        "template": 4, 
-        "owner": 13, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.468Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.507Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 15
-    "model": "core.network", 
+    "pk": 60071
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "", 
-        "updated": "2013-12-13T21:57:38.995Z", 
-        "subnet_id": "", 
-        "name": "test-1-public", 
-        "created": "2013-12-13T21:57:38.995Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "", 
-        "template": 1, 
-        "owner": 14, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.584Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.516Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 16
-    "model": "core.network", 
+    "pk": 60072
+    "model": "core.charge", 
     "fields": {
-        "router_id": "", 
-        "subnet": "", 
-        "updated": "2013-12-13T22:00:40.549Z", 
-        "subnet_id": "", 
-        "name": "test-slice-2-nat", 
-        "created": "2013-12-13T22:00:40.549Z", 
-        "permitAllSlices": false, 
-        "permittedSlices": [], 
-        "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "network_id": "", 
-        "template": 3, 
-        "owner": 15, 
-        "ports": ""
+        "updated": "2013-12-18T21:29:24.692Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.524Z", 
+        "amount": 0.28, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 1
-    "model": "core.networkslice", 
+    "pk": 60073
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:51:09.711Z", 
-        "slice": 11, 
-        "network": 12, 
-        "created": "2013-12-13T21:51:09.711Z"
+        "updated": "2013-12-18T21:29:24.800Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.532Z", 
+        "amount": 0.2856, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 2
-    "model": "core.networkslice", 
+    "pk": 60074
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:53:15.909Z", 
-        "slice": 12, 
-        "network": 13, 
-        "created": "2013-12-13T21:53:15.909Z"
+        "updated": "2013-12-18T21:29:24.907Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.541Z", 
+        "amount": 0.3024, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 3
-    "model": "core.networkslice", 
+    "pk": 60075
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:53:15.914Z", 
-        "slice": 12, 
-        "network": 12, 
-        "created": "2013-12-13T21:53:15.914Z"
+        "updated": "2013-12-18T21:29:25.015Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.549Z", 
+        "amount": 0.2296, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 4
-    "model": "core.networkslice", 
+    "pk": 60076
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.235Z", 
-        "slice": 13, 
-        "network": 14, 
-        "created": "2013-12-13T21:56:04.235Z"
+        "updated": "2013-12-18T21:29:25.123Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.557Z", 
+        "amount": 0.3304, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 5
-    "model": "core.networkslice", 
+    "pk": 60077
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.241Z", 
-        "slice": 13, 
-        "network": 12, 
-        "created": "2013-12-13T21:56:04.241Z"
+        "updated": "2013-12-18T21:29:25.231Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.565Z", 
+        "amount": 0.1792, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60078, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:25.338Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.574Z", 
+        "amount": 0.2912, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 6, 
-    "model": "core.networkslice", 
+    "pk": 60079
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.246Z", 
-        "slice": 13, 
-        "network": 13, 
-        "created": "2013-12-13T21:56:04.246Z"
+        "updated": "2013-12-18T21:29:25.446Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.582Z", 
+        "amount": 0.2128, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 7
-    "model": "core.networkslice", 
+    "pk": 60080
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.826Z", 
-        "slice": 14, 
-        "network": 15, 
-        "created": "2013-12-13T21:57:56.826Z"
+        "updated": "2013-12-18T21:29:25.554Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.590Z", 
+        "amount": 0.1456, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 8
-    "model": "core.networkslice", 
+    "pk": 60081
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.831Z", 
-        "slice": 14, 
-        "network": 13, 
-        "created": "2013-12-13T21:57:56.831Z"
+        "updated": "2013-12-18T21:29:25.661Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.598Z", 
+        "amount": 0.112, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 9
-    "model": "core.networkslice", 
+    "pk": 60082
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.836Z", 
-        "slice": 14, 
-        "network": 12, 
-        "created": "2013-12-13T21:57:56.836Z"
+        "updated": "2013-12-18T21:29:25.769Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.607Z", 
+        "amount": 0.28, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 10
-    "model": "core.networkslice", 
+    "pk": 60083
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:01:14.038Z", 
-        "slice": 15, 
-        "network": 16, 
-        "created": "2013-12-13T22:01:14.038Z"
+        "updated": "2013-12-18T21:29:25.877Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.615Z", 
+        "amount": 0.112, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 11
-    "model": "core.networkslice", 
+    "pk": 60084
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:01:14.043Z", 
-        "slice": 15, 
-        "network": 14, 
-        "created": "2013-12-13T22:01:14.043Z"
+        "updated": "2013-12-18T21:29:25.984Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.623Z", 
+        "amount": 0.224, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 1
-    "model": "core.networkparametertype", 
+    "pk": 60085
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-09T14:43:25.664Z", 
-        "description": "End of IPv4 address allocation pool", 
-        "name": "allocation-pool-end", 
-        "created": "2013-12-09T14:43:25.664Z"
+        "updated": "2013-12-18T21:29:26.092Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.631Z", 
+        "amount": 0.1344, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 2
-    "model": "core.networkparametertype", 
+    "pk": 60086
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-09T14:43:45.564Z", 
-        "description": "Start of IPv4 address allocation pool", 
-        "name": "allocation-pool-start", 
-        "created": "2013-12-09T14:43:45.564Z"
+        "updated": "2013-12-18T21:29:26.200Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.640Z", 
+        "amount": 0.2968, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 3
-    "model": "core.networkparametertype", 
+    "pk": 60087
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-09T14:44:05.513Z", 
-        "description": "CIDR block for network", 
-        "name": "cidr", 
-        "created": "2013-12-09T14:44:05.513Z"
+        "updated": "2013-12-18T21:29:26.307Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.648Z", 
+        "amount": 0.3304, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 12
-    "model": "core.account", 
+    "pk": 60088
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:42.679Z", 
-        "site": 10, 
-        "created": "2013-12-13T22:19:42.679Z"
+        "updated": "2013-12-18T21:29:26.415Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.657Z", 
+        "amount": 0.3192, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.56, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 13
-    "model": "core.account", 
+    "pk": 60089
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:42.705Z", 
-        "site": 22, 
-        "created": "2013-12-13T22:19:42.705Z"
+        "updated": "2013-12-18T21:29:26.523Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.665Z", 
+        "amount": 0.336, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.8, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 53
-    "model": "core.invoice", 
+    "pk": 60090
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-13T22:00:00Z", 
-        "updated": "2013-12-13T22:19:55.029Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:55.029Z"
+        "updated": "2013-12-18T21:29:26.630Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.673Z", 
+        "amount": 0.308, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.4, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 54
-    "model": "core.invoice", 
+    "pk": 60091
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-17T22:00:00Z", 
-        "updated": "2013-12-13T22:19:55.041Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:55.041Z"
+        "updated": "2013-12-18T21:29:26.738Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.681Z", 
+        "amount": 0.1288, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 55
-    "model": "core.invoice", 
+    "pk": 60092
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-24T22:00:00Z", 
-        "updated": "2013-12-13T22:19:55.604Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:55.604Z"
+        "updated": "2013-12-18T21:29:26.854Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.690Z", 
+        "amount": 0.2632, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 56
-    "model": "core.invoice", 
+    "pk": 60093
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-01T22:00:00Z", 
-        "updated": "2013-12-13T22:19:56.482Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:56.482Z"
+        "updated": "2013-12-18T21:29:26.962Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.698Z", 
+        "amount": 0.2184, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 57
-    "model": "core.invoice", 
+    "pk": 60094
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-08T22:00:00Z", 
-        "updated": "2013-12-13T22:19:57.362Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:57.362Z"
+        "updated": "2013-12-18T21:29:27.069Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.706Z", 
+        "amount": 0.1904, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.72, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58
-    "model": "core.invoice", 
+    "pk": 60095
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-13T22:00:00Z", 
-        "updated": "2013-12-13T22:19:58.399Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:19:58.399Z"
+        "updated": "2013-12-18T21:29:27.177Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.714Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59
-    "model": "core.invoice", 
+    "pk": 60096
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-17T22:00:00Z", 
-        "updated": "2013-12-13T22:19:58.414Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:19:58.414Z"
+        "updated": "2013-12-18T21:29:27.285Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.723Z", 
+        "amount": 0.2464, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 60, 
-    "model": "core.invoice", 
+    "pk": 60097
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-24T22:00:00Z", 
-        "updated": "2013-12-13T22:19:59.616Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:19:59.616Z"
+        "updated": "2013-12-18T21:29:27.393Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.731Z", 
+        "amount": 0.2184, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 61
-    "model": "core.invoice", 
+    "pk": 60098
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-01T22:00:00Z", 
-        "updated": "2013-12-13T22:20:01.950Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:20:01.950Z"
+        "updated": "2013-12-18T21:29:27.500Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.739Z", 
+        "amount": 0.1736, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.48, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 62
-    "model": "core.invoice", 
+    "pk": 60099
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-08T22:00:00Z", 
-        "updated": "2013-12-13T22:20:03.878Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:20:03.878Z"
+        "updated": "2013-12-18T21:29:27.666Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.748Z", 
+        "amount": 0.1456, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 89
-    "model": "core.usableobject", 
+    "pk": 60100
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:42.730Z", 
-        "name": "node20.gt.vicci.org", 
-        "created": "2013-12-13T22:19:42.730Z"
+        "updated": "2013-12-18T21:29:27.774Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.756Z", 
+        "amount": 0.1512, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 90
-    "model": "core.usableobject", 
+    "pk": 60101
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.483Z", 
-        "name": "node22.gt.vicci.org", 
-        "created": "2013-12-13T22:19:43.483Z"
+        "updated": "2013-12-18T21:29:27.881Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.764Z", 
+        "amount": 0.3304, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 91
-    "model": "core.usableobject", 
+    "pk": 60102
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.237Z", 
-        "name": "node24.gt.vicci.org", 
-        "created": "2013-12-13T22:19:44.237Z"
+        "updated": "2013-12-18T21:29:27.989Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.773Z", 
+        "amount": 0.168, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 92
-    "model": "core.usableobject", 
+    "pk": 60103
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.992Z", 
-        "name": "node29.gt.vicci.org", 
-        "created": "2013-12-13T22:19:44.992Z"
+        "updated": "2013-12-18T21:29:28.097Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.781Z", 
+        "amount": 0.3024, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 93
-    "model": "core.usableobject", 
+    "pk": 60104
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.806Z", 
-        "name": "node30.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:45.806Z"
+        "updated": "2013-12-18T21:29:28.204Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.789Z", 
+        "amount": 0.2856, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 94
-    "model": "core.usableobject", 
+    "pk": 60105
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.339Z", 
-        "name": "node16.washington.vicci.org", 
-        "created": "2013-12-13T22:19:47.339Z"
+        "updated": "2013-12-18T21:29:28.312Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.797Z", 
+        "amount": 0.2856, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 95
-    "model": "core.usableobject", 
+    "pk": 60106
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.112Z", 
-        "name": "node55.stanford.vicci.org", 
-        "created": "2013-12-13T22:19:48.112Z"
+        "updated": "2013-12-18T21:29:28.420Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.806Z", 
+        "amount": 0.1232, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 96
-    "model": "core.usableobject", 
+    "pk": 60107
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.875Z", 
-        "name": "node23.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:48.875Z"
+        "updated": "2013-12-18T21:29:28.527Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.814Z", 
+        "amount": 0.2632, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 97
-    "model": "core.usableobject", 
+    "pk": 60108
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.635Z", 
-        "name": "node15.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:49.634Z"
+        "updated": "2013-12-18T21:29:28.635Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.822Z", 
+        "amount": 0.196, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 98
-    "model": "core.usableobject", 
+    "pk": 60109
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.389Z", 
-        "name": "node33.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:50.389Z"
+        "updated": "2013-12-18T21:29:28.743Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.830Z", 
+        "amount": 0.1344, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 99
-    "model": "core.usableobject", 
+    "pk": 60110
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.178Z", 
-        "name": "node1.stanford.vicci.org", 
-        "created": "2013-12-13T22:19:51.178Z"
+        "updated": "2013-12-18T21:29:28.851Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.839Z", 
+        "amount": 0.2352, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 100
-    "model": "core.usableobject", 
+    "pk": 60111
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.938Z", 
-        "name": "node20.washington.vicci.org", 
-        "created": "2013-12-13T22:19:51.938Z"
+        "updated": "2013-12-18T21:29:28.958Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.847Z", 
+        "amount": 0.2632, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 101
-    "model": "core.usableobject", 
+    "pk": 60112
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.691Z", 
-        "name": "node12.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:52.691Z"
+        "updated": "2013-12-18T21:29:29.066Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.855Z", 
+        "amount": 0.2128, 
+        "object": 107, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 102
-    "model": "core.usableobject", 
+    "pk": 60113
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.456Z", 
-        "name": "node10.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:53.456Z"
+        "updated": "2013-12-18T21:29:03.864Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.864Z", 
+        "amount": 0.14, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.0, 
+        "invoice": null, 
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 103
-    "model": "core.usableobject", 
+    "pk": 60114
+    "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.216Z", 
-        "name": "node13.princeton.vicci.org", 
-        "created": "2013-12-13T22:19:54.216Z"
+        "updated": "2013-12-18T21:29:03.872Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.872Z", 
+        "amount": 0.252, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.6, 
+        "invoice": null, 
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 31
-    "model": "core.payment", 
+    "pk": 60115
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-28T03:00:00Z", 
-        "amount": 0.1176, 
-        "updated": "2013-12-13T22:19:58.245Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:58.245Z"
+        "updated": "2013-12-18T21:29:03.880Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.880Z", 
+        "amount": 0.28, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.0, 
+        "invoice": null, 
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 32
-    "model": "core.payment", 
+    "pk": 60116
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-02T03:00:00Z", 
-        "amount": 14.9968, 
-        "updated": "2013-12-13T22:19:58.251Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:58.251Z"
+        "updated": "2013-12-18T21:29:03.888Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.888Z", 
+        "amount": 0.1624, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 2.32, 
+        "invoice": null, 
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 33
-    "model": "core.payment", 
+    "pk": 60117
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-09T03:00:00Z", 
-        "amount": 24.8248, 
-        "updated": "2013-12-13T22:19:58.259Z", 
-        "account": 12, 
-        "created": "2013-12-13T22:19:58.259Z"
+        "updated": "2013-12-18T21:29:03.897Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.897Z", 
+        "amount": 0.2744, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.92, 
+        "invoice": null, 
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 34
-    "model": "core.payment", 
+    "pk": 60118
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-11-28T03:00:00Z", 
-        "amount": 0.56, 
-        "updated": "2013-12-13T22:20:05.812Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:20:05.812Z"
+        "updated": "2013-12-18T21:29:03.905Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.905Z", 
+        "amount": 0.28, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.0, 
+        "invoice": null, 
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 35
-    "model": "core.payment", 
+    "pk": 60119
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-02T03:00:00Z", 
-        "amount": 53.9224, 
-        "updated": "2013-12-13T22:20:05.825Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:20:05.825Z"
+        "updated": "2013-12-18T21:29:03.913Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.913Z", 
+        "amount": 0.2408, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 3.44, 
+        "invoice": null, 
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 36
-    "model": "core.payment", 
+    "pk": 60120
+    "model": "core.charge", 
     "fields": {
-        "date": "2013-12-09T03:00:00Z", 
-        "amount": 86.436, 
-        "updated": "2013-12-13T22:20:05.834Z", 
-        "account": 13, 
-        "created": "2013-12-13T22:20:05.834Z"
+        "updated": "2013-12-18T21:29:03.921Z", 
+        "slice": 4, 
+        "created": "2013-12-18T21:29:03.921Z", 
+        "amount": 0.308, 
+        "object": 107, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 4.4, 
+        "invoice": null, 
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58321, 
+    "pk": 60121, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.498Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.734Z", 
-        "amount": 0.3248, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.227Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.953Z", 
+        "amount": 0.2968, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58322, 
+    "pk": 60122, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.590Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.744Z", 
-        "amount": 0.2464
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.335Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.963Z", 
+        "amount": 0.196
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58323, 
+    "pk": 60123, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.681Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.752Z", 
-        "amount": 0.3136
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.442Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.971Z", 
+        "amount": 0.1232
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58324, 
+    "pk": 60124, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.772Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.760Z", 
-        "amount": 0.2576
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.550Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.979Z", 
+        "amount": 0.308
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58325, 
+    "pk": 60125, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.863Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.769Z", 
-        "amount": 0.2912
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.658Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.988Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58326, 
+    "pk": 60126, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.971Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.777Z", 
-        "amount": 0.3136, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.765Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:03.996Z", 
+        "amount": 0.196, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58327, 
+    "pk": 60127, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.062Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.785Z", 
-        "amount": 0.14, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.873Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.004Z", 
+        "amount": 0.2464, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58328, 
+    "pk": 60128, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.154Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.794Z", 
-        "amount": 0.224
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:20.981Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.013Z", 
+        "amount": 0.1736
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58329, 
+    "pk": 60129, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.245Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.802Z", 
-        "amount": 0.224
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.088Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.021Z", 
+        "amount": 0.2968
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58330, 
+    "pk": 60130, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.336Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.810Z", 
-        "amount": 0.2912
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.196Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.029Z", 
+        "amount": 0.1568
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58331, 
+    "pk": 60131, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.427Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.818Z", 
-        "amount": 0.1288
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.304Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.037Z", 
+        "amount": 0.3136
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58332, 
+    "pk": 60132, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.518Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.827Z", 
-        "amount": 0.3024
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.412Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.046Z", 
+        "amount": 0.1456
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58333, 
+    "pk": 60133, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.609Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.835Z", 
-        "amount": 0.1456
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.519Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.054Z", 
+        "amount": 0.1288
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58334, 
+    "pk": 60134, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.720Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.843Z", 
-        "amount": 0.1792
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.627Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.062Z", 
+        "amount": 0.1456
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58335, 
+    "pk": 60135, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.812Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.852Z", 
-        "amount": 0.1512
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.735Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.071Z", 
+        "amount": 0.2128
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58336, 
+    "pk": 60136, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.903Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.860Z", 
-        "amount": 0.168
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.842Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.079Z", 
+        "amount": 0.2856
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58337, 
+    "pk": 60137, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.994Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.868Z", 
-        "amount": 0.1736
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:21.950Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.087Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58338, 
+    "pk": 60138, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.085Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.876Z", 
-        "amount": 0.2184, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.058Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.095Z", 
+        "amount": 0.2744, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58339, 
+    "pk": 60139, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.176Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.885Z", 
-        "amount": 0.3192, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.166Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.104Z", 
+        "amount": 0.2912, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58340, 
+    "pk": 60140, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.267Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.893Z", 
-        "amount": 0.1288
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.281Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.112Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58341, 
+    "pk": 60141, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.358Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.901Z", 
-        "amount": 0.224, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.389Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.120Z", 
+        "amount": 0.2464, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58342, 
+    "pk": 60142, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.452Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.910Z", 
+        "updated": "2013-12-18T21:29:22.497Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.129Z", 
         "amount": 0.1736, 
-        "object": 89
-        "account": 13
+        "object": 108
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.48, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58343, 
+    "pk": 60143, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.543Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.918Z", 
-        "amount": 0.224
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.646Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.137Z", 
+        "amount": 0.1456
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58344, 
+    "pk": 60144, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.651Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.926Z", 
-        "amount": 0.1344
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.754Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.145Z", 
+        "amount": 0.1568
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58345, 
+    "pk": 60145, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.742Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.934Z", 
+        "updated": "2013-12-18T21:29:22.861Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.154Z", 
         "amount": 0.1736, 
-        "object": 89
-        "account": 13
+        "object": 108
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.48, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
-    }
-},
-{
-    "pk": 58346, 
-    "model": "core.charge", 
-    "fields": {
-        "updated": "2013-12-13T22:20:00.833Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:42.943Z", 
-        "amount": 0.2576, 
-        "object": 89, 
-        "account": 13, 
-        "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58347
+    "pk": 60146
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.949Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.951Z", 
-        "amount": 0.3248
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:22.969Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.162Z", 
+        "amount": 0.252
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58348
+    "pk": 60147
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.040Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.959Z", 
-        "amount": 0.3248
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.077Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.170Z", 
+        "amount": 0.2016
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58349
+    "pk": 60148
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.131Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.967Z", 
-        "amount": 0.3136
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.184Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.178Z", 
+        "amount": 0.3192
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58350
+    "pk": 60149
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.222Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.976Z", 
-        "amount": 0.2016
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.292Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.187Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58351
+    "pk": 60150
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.471Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.984Z", 
-        "amount": 0.3248
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.400Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.195Z", 
+        "amount": 0.112
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58352
+    "pk": 60151
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.761Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:42.992Z", 
-        "amount": 0.2296
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.507Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.203Z", 
+        "amount": 0.1568
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58353
+    "pk": 60152
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.852Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.001Z", 
-        "amount": 0.252
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.615Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.212Z", 
+        "amount": 0.28
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58354
+    "pk": 60153
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.943Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.009Z", 
+        "updated": "2013-12-18T21:29:23.723Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.220Z", 
         "amount": 0.2016, 
-        "object": 89
-        "account": 13
+        "object": 108
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.88, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58355
+    "pk": 60154
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.042Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.017Z", 
-        "amount": 0.2744
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.831Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.228Z", 
+        "amount": 0.2072
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58356
+    "pk": 60155
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.133Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.025Z", 
-        "amount": 0.2072
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:23.938Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.236Z", 
+        "amount": 0.2856
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58357
+    "pk": 60156
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.229Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.034Z", 
-        "amount": 0.2688
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.046Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.245Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58358
+    "pk": 60157
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.320Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.042Z", 
-        "amount": 0.1288
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.154Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.253Z", 
+        "amount": 0.3192
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58359
+    "pk": 60158
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.412Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.050Z", 
-        "amount": 0.1456
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.261Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.261Z", 
+        "amount": 0.2912
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58360
+    "pk": 60159
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.503Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.059Z", 
-        "amount": 0.336
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.369Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.269Z", 
+        "amount": 0.2072
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58361
+    "pk": 60160
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.594Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.067Z", 
-        "amount": 0.2072, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.477Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.278Z", 
+        "amount": 0.2912, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58362
+    "pk": 60161
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.685Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.075Z", 
-        "amount": 0.1736
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.593Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.286Z", 
+        "amount": 0.14
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58363
+    "pk": 60162
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.776Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.083Z", 
-        "amount": 0.2576
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.700Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.294Z", 
+        "amount": 0.1848
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58364
+    "pk": 60163
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.867Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.092Z", 
-        "amount": 0.2352
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.808Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.303Z", 
+        "amount": 0.2576
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58365
+    "pk": 60164
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.958Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.100Z", 
-        "amount": 0.2912, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:24.916Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.311Z", 
+        "amount": 0.2072, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58366
+    "pk": 60165
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.049Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.108Z", 
-        "amount": 0.336
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.023Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.319Z", 
+        "amount": 0.1848
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58367
+    "pk": 60166
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.140Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.117Z", 
-        "amount": 0.1176
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.131Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.327Z", 
+        "amount": 0.1568
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58368
+    "pk": 60167
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.232Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.125Z", 
-        "amount": 0.1456
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.239Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.336Z", 
+        "amount": 0.2128
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58369
+    "pk": 60168
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.323Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.133Z", 
-        "amount": 0.1736
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.346Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.344Z", 
+        "amount": 0.168
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58370
+    "pk": 60169
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.416Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.141Z", 
-        "amount": 0.1344
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.454Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.352Z", 
+        "amount": 0.28
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58371
+    "pk": 60170
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.507Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.150Z", 
-        "amount": 0.1232
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.562Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.361Z", 
+        "amount": 0.2296
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58372
+    "pk": 60171
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.598Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.158Z", 
-        "amount": 0.2632
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.670Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.369Z", 
+        "amount": 0.1904
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58373
+    "pk": 60172
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.689Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.166Z", 
-        "amount": 0.2184, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.777Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.377Z", 
+        "amount": 0.1624, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58374
+    "pk": 60173
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.780Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.175Z", 
-        "amount": 0.224
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.885Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.385Z", 
+        "amount": 0.252
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58375
+    "pk": 60174
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.871Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.183Z", 
-        "amount": 0.2632, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:25.993Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.394Z", 
+        "amount": 0.112, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58376
+    "pk": 60175
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.971Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.191Z", 
-        "amount": 0.3304
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.100Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.402Z", 
+        "amount": 0.2576
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58377
+    "pk": 60176
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.062Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.199Z", 
-        "amount": 0.1456
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.208Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.410Z", 
+        "amount": 0.3192
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58378
+    "pk": 60177
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.153Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.208Z", 
-        "amount": 0.1848
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.316Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.419Z", 
+        "amount": 0.2632
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58379
+    "pk": 60178
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.244Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.216Z", 
-        "amount": 0.308
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.423Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.427Z", 
+        "amount": 0.1792
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58380
+    "pk": 60179
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.335Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.224Z", 
-        "amount": 0.3304
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.531Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.435Z", 
+        "amount": 0.196
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58381
+    "pk": 60180
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.426Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.233Z", 
-        "amount": 0.224
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.639Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.443Z", 
+        "amount": 0.1176
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58382
+    "pk": 60181
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.517Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.241Z", 
-        "amount": 0.2464
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.746Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.452Z", 
+        "amount": 0.2408
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58383
+    "pk": 60182
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.608Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.249Z", 
-        "amount": 0.2296, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.862Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.460Z", 
+        "amount": 0.2576, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58384
+    "pk": 60183
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.700Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.257Z", 
-        "amount": 0.1904, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:26.970Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.468Z", 
+        "amount": 0.2744, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58385
+    "pk": 60184
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.791Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.266Z", 
-        "amount": 0.2184, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.078Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.476Z", 
+        "amount": 0.3024, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58386
+    "pk": 60185
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.882Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.274Z", 
-        "amount": 0.1456
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.186Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.485Z", 
+        "amount": 0.3192
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58387
+    "pk": 60186
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.973Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.282Z", 
-        "amount": 0.2576
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.293Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.493Z", 
+        "amount": 0.3304
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58388
+    "pk": 60187
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.064Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.291Z", 
-        "amount": 0.3136
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.401Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.501Z", 
+        "amount": 0.3192
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58389
+    "pk": 60188
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.162Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.299Z", 
-        "amount": 0.2408, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.509Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.510Z", 
+        "amount": 0.168, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58390
+    "pk": 60189
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.253Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.307Z", 
-        "amount": 0.2184
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.674Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.518Z", 
+        "amount": 0.3136
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58391
+    "pk": 60190
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.344Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.315Z", 
-        "amount": 0.2632, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.782Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.526Z", 
+        "amount": 0.1792, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58392
+    "pk": 60191
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.435Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.324Z", 
-        "amount": 0.2968
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.890Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.535Z", 
+        "amount": 0.2576
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58393
+    "pk": 60192
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.526Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.332Z", 
-        "amount": 0.112
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:27.997Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.543Z", 
+        "amount": 0.2464
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58394
+    "pk": 60193
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.617Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.340Z", 
-        "amount": 0.2128, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:28.105Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.551Z", 
+        "amount": 0.2968, 
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58395
+    "pk": 60194
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.709Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.349Z", 
-        "amount": 0.336
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:28.213Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.559Z", 
+        "amount": 0.28
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58396
+    "pk": 60195
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.800Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.357Z", 
-        "amount": 0.1232
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:28.320Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.568Z", 
+        "amount": 0.1344
+        "object": 108
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58397
+    "pk": 60196
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.365Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.365Z", 
-        "amount": 0.2184, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.12, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.428Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.576Z", 
+        "amount": 0.2128, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.04, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58398
+    "pk": 60197
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.374Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.374Z", 
-        "amount": 0.2856, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.08, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.536Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.584Z", 
+        "amount": 0.196, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58399
+    "pk": 60198
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.382Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.382Z", 
-        "amount": 0.2464, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.52, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.644Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.593Z", 
+        "amount": 0.2912, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58400
+    "pk": 60199
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.390Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.390Z", 
-        "amount": 0.1512, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.16, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.751Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.601Z", 
+        "amount": 0.2632, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58401
+    "pk": 60200
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.398Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.398Z", 
-        "amount": 0.1176, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 1.68, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.859Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.609Z", 
+        "amount": 0.3024, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58402
+    "pk": 60201
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.407Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.407Z", 
-        "amount": 0.224, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.2, 
-        "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.967Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.617Z", 
+        "amount": 0.1568, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.24, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58403
+    "pk": 60202
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.415Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.415Z", 
-        "amount": 0.2072, 
-        "object": 89, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.96, 
-        "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.074Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.626Z", 
+        "amount": 0.2352, 
+        "object": 108, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58404
+    "pk": 60203
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.423Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.423Z", 
-        "amount": 0.1288, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.634Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.634Z", 
+        "amount": 0.2688, 
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.84, 
+        "coreHours": 3.84, 
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58405
+    "pk": 60204
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.431Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.431Z", 
+        "updated": "2013-12-18T21:29:04.642Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.642Z", 
         "amount": 0.14, 
-        "object": 89
-        "account": 13
+        "object": 108
+        "account": 15
         "state": "pending", 
         "coreHours": 2.0, 
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58406
+    "pk": 60205
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.440Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.440Z", 
-        "amount": 0.196
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.651Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.651Z", 
+        "amount": 0.28
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.8
+        "coreHours": 4.0
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58407
+    "pk": 60206
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.448Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.448Z", 
-        "amount": 0.112, 
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.659Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.659Z", 
+        "amount": 0.2352, 
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.6, 
+        "coreHours": 3.36, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58408
+    "pk": 60207
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.456Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.456Z", 
-        "amount": 0.3304
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.667Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.667Z", 
+        "amount": 0.1848
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.72
+        "coreHours": 2.64
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58409
+    "pk": 60208
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.465Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.465Z", 
-        "amount": 0.3192
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.676Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.676Z", 
+        "amount": 0.2688
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.56
+        "coreHours": 3.84
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58410
+    "pk": 60209
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:43.473Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.473Z", 
-        "amount": 0.2856
-        "object": 89
-        "account": 13
+        "updated": "2013-12-18T21:29:04.684Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.684Z", 
+        "amount": 0.2184
+        "object": 108
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.08
+        "coreHours": 3.12
         "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58411
+    "pk": 60210
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.482Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:43.488Z", 
-        "amount": 0.1568, 
-        "object": 90, 
-        "account": 13, 
-        "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:04.692Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:04.692Z", 
+        "amount": 0.1176, 
+        "object": 108, 
+        "account": 15, 
+        "state": "pending", 
+        "coreHours": 1.68, 
+        "invoice": null, 
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58412
+    "pk": 60211
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.573Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.498Z", 
-        "amount": 0.14
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.235Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.707Z", 
+        "amount": 0.3136
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58413
+    "pk": 60212
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.664Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.506Z", 
-        "amount": 0.1568
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.343Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.717Z", 
+        "amount": 0.196
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58414
+    "pk": 60213
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.755Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.514Z", 
-        "amount": 0.2184
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.451Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.725Z", 
+        "amount": 0.1176
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58415
+    "pk": 60214
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.846Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.522Z", 
-        "amount": 0.1904
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.558Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.733Z", 
+        "amount": 0.28
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58416
+    "pk": 60215
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.955Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.531Z", 
-        "amount": 0.2968
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.666Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.742Z", 
+        "amount": 0.1792
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58417
+    "pk": 60216
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.046Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.539Z", 
-        "amount": 0.1568
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.774Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.750Z", 
+        "amount": 0.14
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58418
+    "pk": 60217
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.137Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.547Z", 
-        "amount": 0.2408
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.881Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.758Z", 
+        "amount": 0.2576
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58419
+    "pk": 60218
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.228Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.556Z", 
-        "amount": 0.1512
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:20.989Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.767Z", 
+        "amount": 0.1736
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58420
+    "pk": 60219
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.319Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.564Z", 
-        "amount": 0.2744
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.097Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.775Z", 
+        "amount": 0.336
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58421
+    "pk": 60220
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.410Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.572Z", 
-        "amount": 0.3248
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.205Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.783Z", 
+        "amount": 0.2072
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58422
+    "pk": 60221
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.501Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.580Z", 
-        "amount": 0.2128
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.312Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.791Z", 
+        "amount": 0.2184
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58423
+    "pk": 60222
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.593Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.589Z", 
-        "amount": 0.1904
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.420Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.800Z", 
+        "amount": 0.196
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58424
+    "pk": 60223
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.704Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.597Z", 
-        "amount": 0.1176
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.528Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.808Z", 
+        "amount": 0.3192
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58425
+    "pk": 60224
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.795Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.605Z", 
-        "amount": 0.2912
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.636Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.816Z", 
+        "amount": 0.1456
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58426
+    "pk": 60225
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.886Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.614Z", 
-        "amount": 0.1232
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.743Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.825Z", 
+        "amount": 0.2296
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58427
+    "pk": 60226
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.977Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.622Z", 
-        "amount": 0.1456, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.851Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.833Z", 
+        "amount": 0.2016, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58428
+    "pk": 60227
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.068Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.630Z", 
-        "amount": 0.2856
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:21.958Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.841Z", 
+        "amount": 0.2352
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58429
+    "pk": 60228
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.168Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.639Z", 
-        "amount": 0.2072
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.066Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.849Z", 
+        "amount": 0.1456
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58430
+    "pk": 60229
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.259Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.647Z", 
-        "amount": 0.1456
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.174Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.858Z", 
+        "amount": 0.252
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58431
+    "pk": 60230
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.350Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.655Z", 
-        "amount": 0.2688
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.290Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.866Z", 
+        "amount": 0.2296
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58432
+    "pk": 60231
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.444Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.663Z", 
-        "amount": 0.1456
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.397Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.874Z", 
+        "amount": 0.1792
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58433
+    "pk": 60232
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.535Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.672Z", 
-        "amount": 0.3192
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.505Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.883Z", 
+        "amount": 0.1848
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58434
+    "pk": 60233
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.642Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.680Z", 
-        "amount": 0.2856
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.654Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.891Z", 
+        "amount": 0.2128
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58435
+    "pk": 60234
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.733Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.688Z", 
-        "amount": 0.1568
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.762Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.899Z", 
+        "amount": 0.252
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58436
+    "pk": 60235
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.825Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.696Z", 
-        "amount": 0.224
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.870Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.907Z", 
+        "amount": 0.2912
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58437
+    "pk": 60236
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.941Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.705Z", 
-        "amount": 0.1848, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:22.977Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.915Z", 
+        "amount": 0.1568, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58438
+    "pk": 60237
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.032Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.713Z", 
-        "amount": 0.1176
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.085Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.924Z", 
+        "amount": 0.1288
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58439
+    "pk": 60238
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.123Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.721Z", 
-        "amount": 0.3136, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.193Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.932Z", 
+        "amount": 0.2016, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58440
+    "pk": 60239
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.214Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.730Z", 
-        "amount": 0.308
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.300Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.940Z", 
+        "amount": 0.2184
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58441
+    "pk": 60240
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.446Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.738Z", 
-        "amount": 0.2352
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.408Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.949Z", 
+        "amount": 0.1456
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58442
+    "pk": 60241
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.752Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.746Z", 
-        "amount": 0.252
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.516Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.957Z", 
+        "amount": 0.1456
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58443
+    "pk": 60242
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.843Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.754Z", 
-        "amount": 0.2184, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.623Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.965Z", 
+        "amount": 0.3304, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58444
+    "pk": 60243
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.934Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.763Z", 
-        "amount": 0.14
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.731Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.974Z", 
+        "amount": 0.2408
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58445
+    "pk": 60244
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.034Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.771Z", 
-        "amount": 0.1512
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.839Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.982Z", 
+        "amount": 0.2688
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58446
+    "pk": 60245
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.125Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.779Z", 
-        "amount": 0.28
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:23.947Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.990Z", 
+        "amount": 0.3304
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58447
+    "pk": 60246
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.221Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.788Z", 
-        "amount": 0.2688
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.054Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:04.998Z", 
+        "amount": 0.1624
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58448
+    "pk": 60247
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.312Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.796Z", 
-        "amount": 0.2576
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.162Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.007Z", 
+        "amount": 0.1624
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58449
+    "pk": 60248
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.403Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.804Z", 
-        "amount": 0.2408
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.270Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.015Z", 
+        "amount": 0.2184
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58450
+    "pk": 60249
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.494Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.813Z", 
-        "amount": 0.2128
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.377Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.023Z", 
+        "amount": 0.1176
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58451
+    "pk": 60250
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.585Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.821Z", 
-        "amount": 0.224
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.485Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.032Z", 
+        "amount": 0.2632
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58452
+    "pk": 60251
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.676Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.829Z", 
+        "updated": "2013-12-18T21:29:24.601Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.040Z", 
         "amount": 0.1904, 
-        "object": 90
-        "account": 13
+        "object": 109
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58453
+    "pk": 60252
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.768Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.837Z", 
-        "amount": 0.2968
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.709Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.048Z", 
+        "amount": 0.3024
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58454
+    "pk": 60253
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.859Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.846Z", 
-        "amount": 0.2968
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.816Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.056Z", 
+        "amount": 0.2856
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58455
+    "pk": 60254
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.950Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.854Z", 
-        "amount": 0.28
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:24.924Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.065Z", 
+        "amount": 0.3304
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58456
+    "pk": 60255
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.041Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.862Z", 
+        "updated": "2013-12-18T21:29:25.032Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.073Z", 
         "amount": 0.3248, 
-        "object": 90
-        "account": 13
+        "object": 109
+        "account": 15
         "state": "invoiced", 
         "coreHours": 4.64, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58457
+    "pk": 60256
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.132Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.871Z", 
-        "amount": 0.2464
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.139Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.081Z", 
+        "amount": 0.2968
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58458
+    "pk": 60257
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.223Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.879Z", 
-        "amount": 0.1624
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.247Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.090Z", 
+        "amount": 0.308
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58459
+    "pk": 60258
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.314Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.887Z", 
-        "amount": 0.1176
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.355Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.098Z", 
+        "amount": 0.3304
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58460
+    "pk": 60259
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.406Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.895Z", 
-        "amount": 0.2968
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.462Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.106Z", 
+        "amount": 0.252
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58461
+    "pk": 60260
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.498Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.904Z", 
-        "amount": 0.2688
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.570Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.114Z", 
+        "amount": 0.2744
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58462
+    "pk": 60261
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.589Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.912Z", 
-        "amount": 0.1904
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.678Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.123Z", 
+        "amount": 0.2632
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58463
+    "pk": 60262
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.681Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.920Z", 
-        "amount": 0.28
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.786Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.131Z", 
+        "amount": 0.2016
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58464
+    "pk": 60263
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.772Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.929Z", 
-        "amount": 0.1568, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:25.893Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.140Z", 
+        "amount": 0.2688, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60264, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:26.001Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.148Z", 
+        "amount": 0.2856, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58465, 
+    "pk": 60265, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.863Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.937Z", 
-        "amount": 0.308, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.109Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.156Z", 
+        "amount": 0.1848, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58466, 
+    "pk": 60266, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.962Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.945Z", 
-        "amount": 0.2128
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.216Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.164Z", 
+        "amount": 0.1176
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58467, 
+    "pk": 60267, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.053Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.953Z", 
-        "amount": 0.2296, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.324Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.173Z", 
+        "amount": 0.2016, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58468, 
+    "pk": 60268, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.144Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.962Z", 
-        "amount": 0.2912
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.432Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.181Z", 
+        "amount": 0.224
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58469, 
+    "pk": 60269, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.236Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.970Z", 
-        "amount": 0.3304
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.539Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.189Z", 
+        "amount": 0.168
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58470, 
+    "pk": 60270, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.327Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.978Z", 
-        "amount": 0.2576
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.647Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.197Z", 
+        "amount": 0.2968
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58471, 
+    "pk": 60271, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.418Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.986Z", 
-        "amount": 0.1176
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.755Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.206Z", 
+        "amount": 0.1568
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58472, 
+    "pk": 60272, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.509Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:43.995Z", 
-        "amount": 0.1736
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.871Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.214Z", 
+        "amount": 0.2744
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58473, 
+    "pk": 60273, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.600Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.003Z", 
-        "amount": 0.1568
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:26.978Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.222Z", 
+        "amount": 0.3304
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58474, 
+    "pk": 60274, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.691Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.011Z", 
-        "amount": 0.196
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.086Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.231Z", 
+        "amount": 0.1512
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58475, 
+    "pk": 60275, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.782Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.020Z", 
-        "amount": 0.1176
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.194Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.253Z", 
+        "amount": 0.1288
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58476, 
+    "pk": 60276, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.874Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.028Z", 
-        "amount": 0.1736
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.301Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.331Z", 
+        "amount": 0.252
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58477, 
+    "pk": 60277, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.965Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.036Z", 
-        "amount": 0.1344
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.409Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.346Z", 
+        "amount": 0.196
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58478, 
+    "pk": 60278, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.056Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.044Z", 
-        "amount": 0.2296
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.517Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.355Z", 
+        "amount": 0.1904
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58479, 
+    "pk": 60279, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.154Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.053Z", 
-        "amount": 0.2296
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.683Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.363Z", 
+        "amount": 0.2408
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58480, 
+    "pk": 60280, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.245Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.061Z", 
-        "amount": 0.2912
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.790Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.371Z", 
+        "amount": 0.3136
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58481, 
+    "pk": 60281, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.336Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.069Z", 
-        "amount": 0.112
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:27.898Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.380Z", 
+        "amount": 0.2408
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58482, 
+    "pk": 60282, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.427Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.078Z", 
-        "amount": 0.1344
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:28.006Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.388Z", 
+        "amount": 0.1512
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58483, 
+    "pk": 60283, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.518Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.086Z", 
-        "amount": 0.2688, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:28.113Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.396Z", 
+        "amount": 0.28, 
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58484, 
+    "pk": 60284, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.609Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.094Z", 
-        "amount": 0.3248
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:28.221Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.404Z", 
+        "amount": 0.2856
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58485, 
+    "pk": 60285, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.700Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.102Z", 
-        "amount": 0.3192
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:28.329Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.413Z", 
+        "amount": 0.1456
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58486, 
+    "pk": 60286, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.792Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.111Z", 
-        "amount": 0.2296
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:28.436Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.421Z", 
+        "amount": 0.3192
+        "object": 109
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58487, 
+    "pk": 60287, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.119Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.119Z", 
-        "amount": 0.14, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.544Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.429Z", 
+        "amount": 0.3248, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58488, 
+    "pk": 60288, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.127Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.127Z", 
-        "amount": 0.224, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.2, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.652Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.438Z", 
+        "amount": 0.2352, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58489, 
+    "pk": 60289, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.136Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.136Z", 
-        "amount": 0.224, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.2, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.759Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.446Z", 
+        "amount": 0.1288, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58490, 
+    "pk": 60290, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.144Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.144Z", 
-        "amount": 0.112, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 1.6, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.867Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.454Z", 
+        "amount": 0.28, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58491, 
+    "pk": 60291, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.152Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.152Z", 
-        "amount": 0.252, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.6, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.975Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.462Z", 
+        "amount": 0.2464, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58492, 
+    "pk": 60292, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.160Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.160Z", 
-        "amount": 0.2408, 
-        "object": 90, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.083Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.471Z", 
+        "amount": 0.3304, 
+        "object": 109, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58493, 
+    "pk": 60293, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.169Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.169Z", 
-        "amount": 0.308
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.479Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.479Z", 
+        "amount": 0.2632
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.4
+        "coreHours": 3.76
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58494, 
+    "pk": 60294, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.177Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.177Z", 
-        "amount": 0.2744
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.487Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.487Z", 
+        "amount": 0.1736
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.92
+        "coreHours": 2.48
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58495, 
+    "pk": 60295, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.185Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.185Z", 
-        "amount": 0.2744
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.496Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.495Z", 
+        "amount": 0.3248
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.92
+        "coreHours": 4.64
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58496, 
+    "pk": 60296, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.194Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.193Z", 
-        "amount": 0.1848
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.504Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.504Z", 
+        "amount": 0.1344
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.64
+        "coreHours": 1.92
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58497, 
+    "pk": 60297, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.202Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.202Z", 
-        "amount": 0.28
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.512Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.512Z", 
+        "amount": 0.1624
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.0
+        "coreHours": 2.32
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58498, 
+    "pk": 60298, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.210Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.210Z", 
-        "amount": 0.1904
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.520Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.520Z", 
+        "amount": 0.2968
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.72
+        "coreHours": 4.24
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58499, 
+    "pk": 60299, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.218Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.218Z", 
-        "amount": 0.1792, 
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.529Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.529Z", 
+        "amount": 0.1232, 
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.56, 
+        "coreHours": 1.76, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58500, 
+    "pk": 60300, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.227Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.227Z", 
-        "amount": 0.1904
-        "object": 90
-        "account": 13
+        "updated": "2013-12-18T21:29:05.537Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.537Z", 
+        "amount": 0.2296
+        "object": 109
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.72
+        "coreHours": 3.28
         "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
-    }
-},
-{
-    "pk": 58501, 
-    "model": "core.charge", 
-    "fields": {
-        "updated": "2013-12-13T22:19:58.473Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.242Z", 
-        "amount": 0.308, 
-        "object": 91, 
-        "account": 13, 
-        "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58502
+    "pk": 60301
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.565Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.252Z", 
-        "amount": 0.28
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.244Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.552Z", 
+        "amount": 0.2072
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58503
+    "pk": 60302
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.656Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.260Z", 
-        "amount": 0.2632, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.351Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.562Z", 
+        "amount": 0.1512, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58504
+    "pk": 60303
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.747Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.268Z", 
-        "amount": 0.168
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.459Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.570Z", 
+        "amount": 0.1232
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58505
+    "pk": 60304
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.838Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.276Z", 
-        "amount": 0.2744
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.567Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.578Z", 
+        "amount": 0.1176
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58506
+    "pk": 60305
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.929Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.285Z", 
-        "amount": 0.1736
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.674Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.587Z", 
+        "amount": 0.2912
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58507
+    "pk": 60306
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.038Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.293Z", 
-        "amount": 0.1344
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.782Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.595Z", 
+        "amount": 0.1456
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58508
+    "pk": 60307
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.129Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.301Z", 
-        "amount": 0.1288
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.890Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.603Z", 
+        "amount": 0.3136
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58509
+    "pk": 60308
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.220Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.310Z", 
-        "amount": 0.2744
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:20.997Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.611Z", 
+        "amount": 0.252
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58510
+    "pk": 60309
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.311Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.318Z", 
-        "amount": 0.336
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.105Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.620Z", 
+        "amount": 0.2968
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58511
+    "pk": 60310
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.402Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.326Z", 
-        "amount": 0.1624, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.213Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.630Z", 
+        "amount": 0.2184, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58512
+    "pk": 60311
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.493Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.334Z", 
-        "amount": 0.1848, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.321Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.645Z", 
+        "amount": 0.3248, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58513
+    "pk": 60312
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.584Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.343Z", 
-        "amount": 0.1904
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.428Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.655Z", 
+        "amount": 0.1736
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58514
+    "pk": 60313
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.696Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.351Z", 
-        "amount": 0.14
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.536Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.670Z", 
+        "amount": 0.2968
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58515
+    "pk": 60314
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.787Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.359Z", 
-        "amount": 0.1792
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.644Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.680Z", 
+        "amount": 0.1176
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58516
+    "pk": 60315
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.878Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.368Z", 
+        "updated": "2013-12-18T21:29:21.751Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.694Z", 
         "amount": 0.224, 
-        "object": 91
-        "account": 13
+        "object": 110
+        "account": 15
         "state": "invoiced", 
         "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58517
+    "pk": 60316
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.969Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.376Z", 
-        "amount": 0.2688
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.859Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.705Z", 
+        "amount": 0.1624
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58518
+    "pk": 60317
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.060Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.384Z", 
-        "amount": 0.1176
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:21.967Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.719Z", 
+        "amount": 0.3192
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58519
+    "pk": 60318
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.159Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.392Z", 
-        "amount": 0.2016
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.074Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.730Z", 
+        "amount": 0.3304
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58520
+    "pk": 60319
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.251Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.401Z", 
-        "amount": 0.2072
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.182Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.738Z", 
+        "amount": 0.1288
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58521
+    "pk": 60320
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.342Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.409Z", 
-        "amount": 0.3248
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.298Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.747Z", 
+        "amount": 0.1736
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58522
+    "pk": 60321
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.435Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.417Z", 
-        "amount": 0.1232
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.406Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.755Z", 
+        "amount": 0.3304
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58523
+    "pk": 60322
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.526Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.426Z", 
-        "amount": 0.336, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.513Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.763Z", 
+        "amount": 0.2296, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58524
+    "pk": 60323
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.634Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.434Z", 
-        "amount": 0.1736
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.663Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.771Z", 
+        "amount": 0.2072
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58525
+    "pk": 60324
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.725Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.442Z", 
-        "amount": 0.168
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.770Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.780Z", 
+        "amount": 0.1456
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58526
+    "pk": 60325
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.816Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.450Z", 
-        "amount": 0.2968
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.878Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.788Z", 
+        "amount": 0.2856
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58527
+    "pk": 60326
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.932Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.459Z", 
-        "amount": 0.1288
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:22.986Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.796Z", 
+        "amount": 0.2352
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58528
+    "pk": 60327
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.023Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.467Z", 
-        "amount": 0.1736
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.093Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.804Z", 
+        "amount": 0.2408
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58529
+    "pk": 60328
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.114Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.475Z", 
-        "amount": 0.1456
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.201Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.813Z", 
+        "amount": 0.2128
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58530
+    "pk": 60329
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.206Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.484Z", 
-        "amount": 0.28, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.309Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.821Z", 
+        "amount": 0.2408, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58531
+    "pk": 60330
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.404Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.492Z", 
-        "amount": 0.2632
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.416Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.829Z", 
+        "amount": 0.2296
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58532
+    "pk": 60331
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.744Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.500Z", 
+        "updated": "2013-12-18T21:29:23.524Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.838Z", 
+        "amount": 0.2576, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.68, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60332, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:23.632Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.846Z", 
         "amount": 0.3304, 
-        "object": 91
-        "account": 13
+        "object": 110
+        "account": 15
         "state": "invoiced", 
         "coreHours": 4.72, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58533, 
+    "pk": 60333, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.835Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.508Z", 
-        "amount": 0.112
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.739Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.854Z", 
+        "amount": 0.1176
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58534, 
+    "pk": 60334, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.926Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.517Z", 
-        "amount": 0.112, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.847Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.862Z", 
+        "amount": 0.2072, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58535, 
+    "pk": 60335, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.026Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.525Z", 
-        "amount": 0.2688
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:23.955Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.871Z", 
+        "amount": 0.2632
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58536, 
+    "pk": 60336, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.117Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.533Z", 
-        "amount": 0.3024
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.062Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.879Z", 
+        "amount": 0.1736
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58537, 
+    "pk": 60337, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.208Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.541Z", 
-        "amount": 0.2576
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.170Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.887Z", 
+        "amount": 0.2632
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58538, 
+    "pk": 60338, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.304Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.550Z", 
-        "amount": 0.252
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.278Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.896Z", 
+        "amount": 0.3136
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58539, 
+    "pk": 60339, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.395Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.558Z", 
-        "amount": 0.1904, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.385Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.904Z", 
+        "amount": 0.2744, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58540, 
+    "pk": 60340, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.486Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.566Z", 
-        "amount": 0.2912
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.493Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.912Z", 
+        "amount": 0.2856
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58541, 
+    "pk": 60341, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.577Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.575Z", 
-        "amount": 0.1792
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.609Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.921Z", 
+        "amount": 0.168
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58542, 
+    "pk": 60342, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.668Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.583Z", 
-        "amount": 0.2856
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.717Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.929Z", 
+        "amount": 0.14
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58543, 
+    "pk": 60343, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.759Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.591Z", 
-        "amount": 0.2184
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.825Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.937Z", 
+        "amount": 0.1288
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58544, 
+    "pk": 60344, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.851Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.599Z", 
-        "amount": 0.1176
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:24.932Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.945Z", 
+        "amount": 0.2632
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58545, 
+    "pk": 60345, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.942Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.608Z", 
+        "updated": "2013-12-18T21:29:25.040Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.954Z", 
         "amount": 0.2912, 
-        "object": 91
-        "account": 13
+        "object": 110
+        "account": 15
         "state": "invoiced", 
         "coreHours": 4.16, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60346, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:25.148Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:05.962Z", 
+        "amount": 0.3304, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58546
+    "pk": 60347
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.033Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.616Z", 
-        "amount": 0.1512
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.255Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.970Z", 
+        "amount": 0.2688
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58547
+    "pk": 60348
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.124Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.624Z", 
-        "amount": 0.1232
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.363Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.978Z", 
+        "amount": 0.308
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58548
+    "pk": 60349
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.215Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.633Z", 
-        "amount": 0.14
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.471Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.987Z", 
+        "amount": 0.1288
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58549
+    "pk": 60350
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.306Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.641Z", 
-        "amount": 0.1176
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.578Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:05.995Z", 
+        "amount": 0.3248
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58550
+    "pk": 60351
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.397Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.649Z", 
-        "amount": 0.1176
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.686Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.003Z", 
+        "amount": 0.2968
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58551
+    "pk": 60352
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.490Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.657Z", 
-        "amount": 0.2016
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.794Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.012Z", 
+        "amount": 0.3024
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58552
+    "pk": 60353
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.581Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.666Z", 
-        "amount": 0.1624, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:25.902Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.020Z", 
+        "amount": 0.224, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58553
+    "pk": 60354
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.672Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.674Z", 
-        "amount": 0.2296
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.009Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.028Z", 
+        "amount": 0.1848
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58554
+    "pk": 60355
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.763Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.682Z", 
-        "amount": 0.1176, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.117Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.036Z", 
+        "amount": 0.2576, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58555
+    "pk": 60356
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.855Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.690Z", 
-        "amount": 0.2016
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.225Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.045Z", 
+        "amount": 0.2968
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58556
+    "pk": 60357
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.954Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.699Z", 
-        "amount": 0.2296
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.332Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.053Z", 
+        "amount": 0.168
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58557
+    "pk": 60358
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.045Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.707Z", 
-        "amount": 0.2856
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.440Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.061Z", 
+        "amount": 0.1848
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58558
+    "pk": 60359
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.136Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.715Z", 
-        "amount": 0.2744
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.548Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.070Z", 
+        "amount": 0.2128
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58559
+    "pk": 60360
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.227Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.724Z", 
-        "amount": 0.1344
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.655Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.078Z", 
+        "amount": 0.1568
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58560
+    "pk": 60361
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.319Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.732Z", 
-        "amount": 0.28
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.763Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.086Z", 
+        "amount": 0.2576
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58561
+    "pk": 60362
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.410Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.740Z", 
-        "amount": 0.3136
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.879Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.094Z", 
+        "amount": 0.1792
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58562
+    "pk": 60363
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.501Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.749Z", 
-        "amount": 0.1456, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:26.987Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.103Z", 
+        "amount": 0.2856, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58563
+    "pk": 60364
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.592Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.757Z", 
-        "amount": 0.2744
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.094Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.111Z", 
+        "amount": 0.1848
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58564
+    "pk": 60365
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.683Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.765Z", 
-        "amount": 0.3024, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.202Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.119Z", 
+        "amount": 0.1344, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58565
+    "pk": 60366
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.774Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.773Z", 
-        "amount": 0.2576
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.310Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.128Z", 
+        "amount": 0.1792
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58566
+    "pk": 60367
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.865Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.782Z", 
-        "amount": 0.2072
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.418Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.136Z", 
+        "amount": 0.196
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58567
+    "pk": 60368
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.956Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.790Z", 
-        "amount": 0.1904
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.525Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.144Z", 
+        "amount": 0.1232
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58568
+    "pk": 60369
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.048Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.798Z", 
-        "amount": 0.1512, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.691Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.153Z", 
+        "amount": 0.3192, 
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58569
+    "pk": 60370
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.145Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.807Z", 
-        "amount": 0.2296
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.798Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.161Z", 
+        "amount": 0.2184
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58570
+    "pk": 60371
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.236Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.815Z", 
-        "amount": 0.2128
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:27.906Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.169Z", 
+        "amount": 0.3192
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58571
+    "pk": 60372
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.327Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.823Z", 
-        "amount": 0.1568
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.014Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.177Z", 
+        "amount": 0.3024
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58572
+    "pk": 60373
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.419Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.831Z", 
-        "amount": 0.2296
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.122Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.186Z", 
+        "amount": 0.1288
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58573
+    "pk": 60374
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.510Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.840Z", 
-        "amount": 0.224
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.229Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.194Z", 
+        "amount": 0.1456
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58574
+    "pk": 60375
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.601Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.848Z", 
-        "amount": 0.196
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.337Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.202Z", 
+        "amount": 0.1288
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58575
+    "pk": 60376
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.692Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.856Z", 
-        "amount": 0.308
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.445Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.210Z", 
+        "amount": 0.2632
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58576
+    "pk": 60377
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.783Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.865Z", 
-        "amount": 0.2128
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:28.552Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.219Z", 
+        "amount": 0.3192
+        "object": 110
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58577
+    "pk": 60378
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.873Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.873Z", 
-        "amount": 0.2408, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.660Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.227Z", 
+        "amount": 0.224, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58578
+    "pk": 60379
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.881Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.881Z", 
-        "amount": 0.2632, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.76, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.768Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.235Z", 
+        "amount": 0.2184, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58579
+    "pk": 60380
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.890Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.890Z", 
-        "amount": 0.3192, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.56, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.875Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.244Z", 
+        "amount": 0.196, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.8, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58580
+    "pk": 60381
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.898Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.898Z", 
-        "amount": 0.2352, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.36, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.983Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.252Z", 
+        "amount": 0.28, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58581
+    "pk": 60382
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.906Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.906Z", 
-        "amount": 0.1456, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.08, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.091Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.260Z", 
+        "amount": 0.224, 
+        "object": 110, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.2, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58582
+    "pk": 60383
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.914Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.914Z", 
-        "amount": 0.3136
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.269Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.268Z", 
+        "amount": 0.3304
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.48
+        "coreHours": 4.72
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58583
+    "pk": 60384
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.923Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.923Z", 
-        "amount": 0.1736
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.277Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.277Z", 
+        "amount": 0.1848
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.48
+        "coreHours": 2.64
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58584
+    "pk": 60385
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.931Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.931Z", 
-        "amount": 0.2352
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.285Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.285Z", 
+        "amount": 0.28
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.36
+        "coreHours": 4.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58585
+    "pk": 60386
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.939Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.939Z", 
-        "amount": 0.2296, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.293Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.293Z", 
+        "amount": 0.1176, 
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.28, 
+        "coreHours": 1.68, 
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58586
+    "pk": 60387
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.947Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.947Z", 
-        "amount": 0.1456, 
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.302Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.302Z", 
+        "amount": 0.2016, 
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.08, 
+        "coreHours": 2.88, 
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58587
+    "pk": 60388
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.957Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.957Z", 
-        "amount": 0.2688
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.310Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.310Z", 
+        "amount": 0.2576
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.84
+        "coreHours": 3.68
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58588
+    "pk": 60389
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.966Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.966Z", 
-        "amount": 0.224
-        "object": 91
-        "account": 13
+        "updated": "2013-12-18T21:29:06.318Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.318Z", 
+        "amount": 0.336
+        "object": 110
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.2
+        "coreHours": 4.8
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58589
+    "pk": 60390
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.974Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.974Z", 
+        "updated": "2013-12-18T21:29:06.326Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.326Z", 
         "amount": 0.3248, 
-        "object": 91
-        "account": 13
+        "object": 110
+        "account": 15
         "state": "pending", 
         "coreHours": 4.64, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58590
+    "pk": 60391
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:44.982Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:44.982Z", 
-        "amount": 0.2352, 
-        "object": 91, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.36, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.252Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.341Z", 
+        "amount": 0.3248, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58591
+    "pk": 60392
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.465Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:44.997Z", 
-        "amount": 0.308, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.360Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.351Z", 
+        "amount": 0.3248, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58592
+    "pk": 60393
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.556Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.007Z", 
-        "amount": 0.168
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.467Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.360Z", 
+        "amount": 0.2576
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58593
+    "pk": 60394
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.648Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.015Z", 
-        "amount": 0.252
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.575Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.368Z", 
+        "amount": 0.3136
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58594
+    "pk": 60395
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.739Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.024Z", 
-        "amount": 0.28
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.683Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.376Z", 
+        "amount": 0.112
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58595
+    "pk": 60396
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.830Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.032Z", 
-        "amount": 0.2576
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.790Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.384Z", 
+        "amount": 0.28
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58596
+    "pk": 60397
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.921Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.040Z", 
-        "amount": 0.1736
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:20.898Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.393Z", 
+        "amount": 0.1344
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58597
+    "pk": 60398
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.029Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.049Z", 
-        "amount": 0.1512
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.006Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.401Z", 
+        "amount": 0.1176
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58598
+    "pk": 60399
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.120Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.057Z", 
-        "amount": 0.112
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.113Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.409Z", 
+        "amount": 0.1176
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58599
+    "pk": 60400
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.212Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.065Z", 
-        "amount": 0.2464, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.221Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.417Z", 
+        "amount": 0.3024, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58600
+    "pk": 60401
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.303Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.073Z", 
-        "amount": 0.2128
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.329Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.426Z", 
+        "amount": 0.1232
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58601
+    "pk": 60402
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.394Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.082Z", 
-        "amount": 0.3024
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.436Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.434Z", 
+        "amount": 0.252
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58602
+    "pk": 60403
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.485Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.090Z", 
-        "amount": 0.308
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.544Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.442Z", 
+        "amount": 0.1624
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58603
+    "pk": 60404
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.576Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.098Z", 
-        "amount": 0.3304
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.652Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.451Z", 
+        "amount": 0.2632
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58604
+    "pk": 60405
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.675Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.106Z", 
-        "amount": 0.2688, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.760Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.459Z", 
+        "amount": 0.1848, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58605
+    "pk": 60406
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.778Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.115Z", 
-        "amount": 0.3192
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.867Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.467Z", 
+        "amount": 0.2184
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58606
+    "pk": 60407
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.870Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.123Z", 
-        "amount": 0.2352
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:21.975Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.475Z", 
+        "amount": 0.2408
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58607
+    "pk": 60408
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.961Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.131Z", 
-        "amount": 0.2856
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.083Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.484Z", 
+        "amount": 0.2184
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58608
+    "pk": 60409
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.052Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.140Z", 
-        "amount": 0.2408, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.190Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.492Z", 
+        "amount": 0.1288, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58609
+    "pk": 60410
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.151Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.148Z", 
-        "amount": 0.2128, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.306Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.500Z", 
+        "amount": 0.2688, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58610
+    "pk": 60411
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.242Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.156Z", 
-        "amount": 0.2464
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.414Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.509Z", 
+        "amount": 0.2072
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58611
+    "pk": 60412
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.333Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.164Z", 
-        "amount": 0.14
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.522Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.517Z", 
+        "amount": 0.1232
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58612
+    "pk": 60413
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.427Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.173Z", 
-        "amount": 0.1568
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.671Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.525Z", 
+        "amount": 0.1792
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58613
+    "pk": 60414
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.518Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.181Z", 
-        "amount": 0.2296
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.779Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.534Z", 
+        "amount": 0.3024
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58614
+    "pk": 60415
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.626Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.189Z", 
-        "amount": 0.1232
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.886Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.542Z", 
+        "amount": 0.1568
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58615
+    "pk": 60416
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.717Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.198Z", 
-        "amount": 0.224
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:22.994Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.550Z", 
+        "amount": 0.1232
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58616
+    "pk": 60417
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.808Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.206Z", 
-        "amount": 0.2856
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.102Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.558Z", 
+        "amount": 0.3248
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58617
+    "pk": 60418
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.924Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.214Z", 
-        "amount": 0.336
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.209Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.567Z", 
+        "amount": 0.14
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58618
+    "pk": 60419
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.015Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.222Z", 
-        "amount": 0.3192, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.317Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.575Z", 
+        "amount": 0.2352, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58619
+    "pk": 60420
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.106Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.231Z", 
-        "amount": 0.252
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.425Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.583Z", 
+        "amount": 0.1568
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58620
+    "pk": 60421
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.197Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.239Z", 
-        "amount": 0.1512
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.532Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.591Z", 
+        "amount": 0.1288
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58621
+    "pk": 60422
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.363Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.247Z", 
-        "amount": 0.14
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.640Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.600Z", 
+        "amount": 0.2912
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58622
+    "pk": 60423
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.736Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.256Z", 
+        "updated": "2013-12-18T21:29:23.748Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.608Z", 
         "amount": 0.14, 
-        "object": 92
-        "account": 13
+        "object": 111
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58623
+    "pk": 60424
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.827Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.264Z", 
-        "amount": 0.1288
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.855Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.616Z", 
+        "amount": 0.1792
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58624
+    "pk": 60425
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.918Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.272Z", 
-        "amount": 0.1288
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:23.963Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.625Z", 
+        "amount": 0.252
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58625
+    "pk": 60426
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.017Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.280Z", 
-        "amount": 0.2296, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.071Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.633Z", 
+        "amount": 0.196, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58626
+    "pk": 60427
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.108Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.289Z", 
-        "amount": 0.14, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.178Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.641Z", 
+        "amount": 0.2744, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58627
+    "pk": 60428
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.199Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.297Z", 
-        "amount": 0.2464
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.286Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.650Z", 
+        "amount": 0.168
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58628
+    "pk": 60429
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.296Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.305Z", 
-        "amount": 0.1904, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.394Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.658Z", 
+        "amount": 0.3024, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58629
+    "pk": 60430
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.387Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.314Z", 
-        "amount": 0.2408
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.501Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.666Z", 
+        "amount": 0.3192
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58630
+    "pk": 60431
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.478Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.322Z", 
-        "amount": 0.1736, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.617Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.674Z", 
+        "amount": 0.3136, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58631
+    "pk": 60432
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.569Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.330Z", 
-        "amount": 0.1512
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.725Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.683Z", 
+        "amount": 0.3024
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58632
+    "pk": 60433
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.660Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.339Z", 
-        "amount": 0.2912
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.833Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.691Z", 
+        "amount": 0.1176
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58633
+    "pk": 60434
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.751Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.347Z", 
-        "amount": 0.1512, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:24.941Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.699Z", 
+        "amount": 0.1232, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58634
+    "pk": 60435
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.842Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.355Z", 
+        "updated": "2013-12-18T21:29:25.048Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.708Z", 
         "amount": 0.2632, 
-        "object": 92
-        "account": 13
+        "object": 111
+        "account": 15
         "state": "invoiced", 
         "coreHours": 3.76, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58635
+    "pk": 60436
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.933Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.363Z", 
-        "amount": 0.2968, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.156Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.716Z", 
+        "amount": 0.2128, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58636
+    "pk": 60437
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.025Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.372Z", 
-        "amount": 0.2352
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.264Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.724Z", 
+        "amount": 0.2968
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58637
+    "pk": 60438
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.116Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.380Z", 
-        "amount": 0.252, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.371Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.732Z", 
+        "amount": 0.2912, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58638
+    "pk": 60439
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.207Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.388Z", 
-        "amount": 0.2072
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.479Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.741Z", 
+        "amount": 0.1848
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58639
+    "pk": 60440
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.298Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.396Z", 
-        "amount": 0.224
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.587Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.749Z", 
+        "amount": 0.1568
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58640
+    "pk": 60441
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.389Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.405Z", 
-        "amount": 0.2408
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.694Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.757Z", 
+        "amount": 0.2296
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58641
+    "pk": 60442
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.482Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.413Z", 
-        "amount": 0.1512
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.802Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.766Z", 
+        "amount": 0.1848
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58642
+    "pk": 60443
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.573Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.421Z", 
-        "amount": 0.1736
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:25.910Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.774Z", 
+        "amount": 0.112
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58643
+    "pk": 60444
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.664Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.430Z", 
-        "amount": 0.3136, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.017Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.782Z", 
+        "amount": 0.2296, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58644
+    "pk": 60445
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.755Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.438Z", 
-        "amount": 0.2184
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.125Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.790Z", 
+        "amount": 0.1232
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58645
+    "pk": 60446
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.838Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.446Z", 
-        "amount": 0.336
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.233Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.799Z", 
+        "amount": 0.1288
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58646
+    "pk": 60447
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.937Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.454Z", 
-        "amount": 0.14, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.341Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.807Z", 
+        "amount": 0.1456
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58647
+    "pk": 60448
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.028Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.463Z", 
-        "amount": 0.1288
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.448Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.815Z", 
+        "amount": 0.252
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58648
+    "pk": 60449
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.120Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.471Z", 
-        "amount": 0.1624
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.556Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.823Z", 
+        "amount": 0.3136
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58649
+    "pk": 60450
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.211Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.479Z", 
-        "amount": 0.196
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.664Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.832Z", 
+        "amount": 0.2408
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58650
+    "pk": 60451
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.302Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.487Z", 
-        "amount": 0.2576, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.771Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.840Z", 
+        "amount": 0.2016, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58651
+    "pk": 60452
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.393Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.496Z", 
-        "amount": 0.308
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.887Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.848Z", 
+        "amount": 0.2464
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58652
+    "pk": 60453
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.484Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.504Z", 
-        "amount": 0.28, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:26.995Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.857Z", 
+        "amount": 0.2856
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58653
+    "pk": 60454
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.575Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.534Z", 
-        "amount": 0.2464
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.103Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.865Z", 
+        "amount": 0.3192
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58654
+    "pk": 60455
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.666Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.554Z", 
-        "amount": 0.2464
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.210Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.873Z", 
+        "amount": 0.2576
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58655
+    "pk": 60456
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.757Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.562Z", 
-        "amount": 0.2464
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.318Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.881Z", 
+        "amount": 0.2072
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58656
+    "pk": 60457
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.849Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.570Z", 
+        "updated": "2013-12-18T21:29:27.426Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.890Z", 
         "amount": 0.2184, 
-        "object": 92
-        "account": 13
+        "object": 111
+        "account": 15
         "state": "invoiced", 
         "coreHours": 3.12, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58657
+    "pk": 60458
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.940Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.579Z", 
-        "amount": 0.196
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.533Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.898Z", 
+        "amount": 0.1344
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58658
+    "pk": 60459
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.039Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.587Z", 
-        "amount": 0.3024
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.699Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.906Z", 
+        "amount": 0.28
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58659
+    "pk": 60460
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.137Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.595Z", 
-        "amount": 0.3192
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.807Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.915Z", 
+        "amount": 0.1568
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58660
+    "pk": 60461
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.228Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.603Z", 
-        "amount": 0.196
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:27.914Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.923Z", 
+        "amount": 0.2744
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58661
+    "pk": 60462
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.319Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.612Z", 
+        "updated": "2013-12-18T21:29:28.022Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.931Z", 
         "amount": 0.1624, 
-        "object": 92
-        "account": 13
+        "object": 111
+        "account": 15
         "state": "invoiced", 
         "coreHours": 2.32, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58662
+    "pk": 60463
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.410Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.620Z", 
-        "amount": 0.2072
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:28.130Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.939Z", 
+        "amount": 0.1456
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58663
+    "pk": 60464
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.501Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.628Z", 
-        "amount": 0.3304, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:28.238Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.948Z", 
+        "amount": 0.14, 
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58664
+    "pk": 60465
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.593Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.637Z", 
-        "amount": 0.2128
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:28.345Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.956Z", 
+        "amount": 0.224
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58665
+    "pk": 60466
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.684Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.645Z", 
-        "amount": 0.252
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:28.453Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.964Z", 
+        "amount": 0.2688
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58666
+    "pk": 60467
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.775Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.653Z", 
-        "amount": 0.3192
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:28.561Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:06.972Z", 
+        "amount": 0.224
+        "object": 111
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
-    }
-},
-{
-    "pk": 58667, 
-    "model": "core.charge", 
-    "fields": {
-        "updated": "2013-12-13T22:19:45.662Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.661Z", 
-        "amount": 0.112, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 1.6, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58668, 
+    "pk": 60468, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.670Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.670Z", 
-        "amount": 0.2072, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.96, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.668Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.981Z", 
+        "amount": 0.1176, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58669, 
+    "pk": 60469, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.678Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.678Z", 
-        "amount": 0.2464, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.52, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.776Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.989Z", 
+        "amount": 0.2296, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58670, 
+    "pk": 60470, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.686Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.686Z", 
-        "amount": 0.1232, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 1.76, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.884Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:06.997Z", 
+        "amount": 0.2072, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58671, 
+    "pk": 60471, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.695Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.695Z", 
-        "amount": 0.1624, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.32, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.991Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:07.006Z", 
+        "amount": 0.1344, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 1.92, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58672, 
+    "pk": 60472, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.703Z", 
-        "slice": 4, 
-        "created": "2013-12-13T22:19:45.703Z", 
-        "amount": 0.14, 
-        "object": 92, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.0, 
-        "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.099Z", 
+        "slice": 6, 
+        "created": "2013-12-18T21:29:07.014Z", 
+        "amount": 0.2352, 
+        "object": 111, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58673, 
+    "pk": 60473, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.711Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.711Z", 
-        "amount": 0.3304
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.022Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.022Z", 
+        "amount": 0.308
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.72
+        "coreHours": 4.4
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58674, 
+    "pk": 60474, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.719Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.719Z", 
-        "amount": 0.196
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.031Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.031Z", 
+        "amount": 0.14
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.8
+        "coreHours": 2.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58675, 
+    "pk": 60475, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.728Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.728Z", 
-        "amount": 0.2912
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.039Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.039Z", 
+        "amount": 0.1344
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.16
+        "coreHours": 1.92
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58676, 
+    "pk": 60476, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.736Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.736Z", 
-        "amount": 0.1904
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.047Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.047Z", 
+        "amount": 0.196
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.72
+        "coreHours": 2.8
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58677, 
+    "pk": 60477, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.744Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.744Z", 
-        "amount": 0.3136, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.055Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.055Z", 
+        "amount": 0.336, 
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.48, 
+        "coreHours": 4.8, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58678, 
+    "pk": 60478, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.753Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.753Z", 
-        "amount": 0.3304
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.064Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.064Z", 
+        "amount": 0.3248
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.72
+        "coreHours": 4.64
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58679, 
+    "pk": 60479, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.761Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.761Z", 
-        "amount": 0.1792, 
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.072Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.072Z", 
+        "amount": 0.2912, 
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.56, 
+        "coreHours": 4.16, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58680, 
+    "pk": 60480, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:45.769Z", 
-        "slice": 4
-        "created": "2013-12-13T22:19:45.769Z", 
-        "amount": 0.1344
-        "object": 92
-        "account": 13
+        "updated": "2013-12-18T21:29:07.080Z", 
+        "slice": 6
+        "created": "2013-12-18T21:29:07.080Z", 
+        "amount": 0.28
+        "object": 111
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.92
+        "coreHours": 4.0
         "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58681, 
+    "pk": 60481, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.457Z", 
+        "updated": "2013-12-18T21:29:20.260Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.817Z", 
+        "created": "2013-12-18T21:29:07.112Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58682, 
+    "pk": 60482, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.548Z", 
+        "updated": "2013-12-18T21:29:20.368Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.827Z", 
+        "created": "2013-12-18T21:29:07.122Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58683, 
+    "pk": 60483, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.639Z", 
+        "updated": "2013-12-18T21:29:20.476Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.836Z", 
+        "created": "2013-12-18T21:29:07.130Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58684, 
+    "pk": 60484, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.730Z", 
+        "updated": "2013-12-18T21:29:20.583Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.844Z", 
+        "created": "2013-12-18T21:29:07.138Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58685, 
+    "pk": 60485, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.822Z", 
+        "updated": "2013-12-18T21:29:20.691Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.852Z", 
+        "created": "2013-12-18T21:29:07.147Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58686, 
+    "pk": 60486, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.913Z", 
+        "updated": "2013-12-18T21:29:20.799Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.860Z", 
+        "created": "2013-12-18T21:29:07.155Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58687, 
+    "pk": 60487, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.021Z", 
+        "updated": "2013-12-18T21:29:20.906Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.869Z", 
+        "created": "2013-12-18T21:29:07.163Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58688, 
+    "pk": 60488, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.112Z", 
+        "updated": "2013-12-18T21:29:21.014Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.877Z", 
+        "created": "2013-12-18T21:29:07.171Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58689, 
+    "pk": 60489, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.203Z", 
+        "updated": "2013-12-18T21:29:21.122Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.885Z", 
+        "created": "2013-12-18T21:29:07.180Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58690, 
+    "pk": 60490, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.294Z", 
+        "updated": "2013-12-18T21:29:21.229Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.893Z", 
+        "created": "2013-12-18T21:29:07.188Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58691, 
+    "pk": 60491, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.386Z", 
+        "updated": "2013-12-18T21:29:21.337Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.902Z", 
+        "created": "2013-12-18T21:29:07.196Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58692, 
+    "pk": 60492, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.477Z", 
+        "updated": "2013-12-18T21:29:21.445Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.910Z", 
+        "created": "2013-12-18T21:29:07.205Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58693, 
+    "pk": 60493, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.568Z", 
+        "updated": "2013-12-18T21:29:21.552Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.918Z", 
+        "created": "2013-12-18T21:29:07.213Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58694, 
+    "pk": 60494, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.667Z", 
+        "updated": "2013-12-18T21:29:21.660Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.927Z", 
+        "created": "2013-12-18T21:29:07.221Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58695, 
+    "pk": 60495, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.770Z", 
+        "updated": "2013-12-18T21:29:21.768Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.935Z", 
+        "created": "2013-12-18T21:29:07.230Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58696, 
+    "pk": 60496, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.861Z", 
+        "updated": "2013-12-18T21:29:21.876Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.943Z", 
+        "created": "2013-12-18T21:29:07.238Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58697, 
+    "pk": 60497, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.952Z", 
+        "updated": "2013-12-18T21:29:21.983Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.951Z", 
+        "created": "2013-12-18T21:29:07.246Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58698, 
+    "pk": 60498, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.043Z", 
+        "updated": "2013-12-18T21:29:22.091Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.960Z", 
+        "created": "2013-12-18T21:29:07.254Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58699, 
+    "pk": 60499, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.143Z", 
+        "updated": "2013-12-18T21:29:22.199Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.968Z", 
+        "created": "2013-12-18T21:29:07.262Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58700, 
+    "pk": 60500, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.234Z", 
+        "updated": "2013-12-18T21:29:22.315Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.976Z", 
+        "created": "2013-12-18T21:29:07.271Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58701, 
+    "pk": 60501, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.325Z", 
+        "updated": "2013-12-18T21:29:22.422Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.985Z", 
+        "created": "2013-12-18T21:29:07.279Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58702, 
+    "pk": 60502, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.419Z", 
+        "updated": "2013-12-18T21:29:22.530Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:45.993Z", 
+        "created": "2013-12-18T21:29:07.287Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58703, 
+    "pk": 60503, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.510Z", 
+        "updated": "2013-12-18T21:29:22.679Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.001Z", 
+        "created": "2013-12-18T21:29:07.296Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58704, 
+    "pk": 60504, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.617Z", 
+        "updated": "2013-12-18T21:29:22.787Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.009Z", 
+        "created": "2013-12-18T21:29:07.304Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58705, 
+    "pk": 60505, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.709Z", 
+        "updated": "2013-12-18T21:29:22.894Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.018Z", 
+        "created": "2013-12-18T21:29:07.312Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58706, 
+    "pk": 60506, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.800Z", 
+        "updated": "2013-12-18T21:29:23.002Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.026Z", 
+        "created": "2013-12-18T21:29:07.321Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58707, 
+    "pk": 60507, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.918Z", 
+        "updated": "2013-12-18T21:29:23.110Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.034Z", 
+        "created": "2013-12-18T21:29:07.329Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58708, 
+    "pk": 60508, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.007Z", 
+        "updated": "2013-12-18T21:29:23.218Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.043Z", 
+        "created": "2013-12-18T21:29:07.337Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58709, 
+    "pk": 60509, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.098Z", 
+        "updated": "2013-12-18T21:29:23.325Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.051Z", 
+        "created": "2013-12-18T21:29:07.345Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58710, 
+    "pk": 60510, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.189Z", 
+        "updated": "2013-12-18T21:29:23.433Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.059Z", 
+        "created": "2013-12-18T21:29:07.354Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58711, 
+    "pk": 60511, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.355Z", 
+        "updated": "2013-12-18T21:29:23.541Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.067Z", 
+        "created": "2013-12-18T21:29:07.362Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58712, 
+    "pk": 60512, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.727Z", 
+        "updated": "2013-12-18T21:29:23.648Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.076Z", 
+        "created": "2013-12-18T21:29:07.370Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58713, 
+    "pk": 60513, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.818Z", 
+        "updated": "2013-12-18T21:29:23.756Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.084Z", 
+        "created": "2013-12-18T21:29:07.378Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58714, 
+    "pk": 60514, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.910Z", 
+        "updated": "2013-12-18T21:29:23.864Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.092Z", 
+        "created": "2013-12-18T21:29:07.387Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58715, 
+    "pk": 60515, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.009Z", 
+        "updated": "2013-12-18T21:29:23.971Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.101Z", 
+        "created": "2013-12-18T21:29:07.395Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58716, 
+    "pk": 60516, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.100Z", 
+        "updated": "2013-12-18T21:29:24.079Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.109Z", 
+        "created": "2013-12-18T21:29:07.403Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58717, 
+    "pk": 60517, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.191Z", 
+        "updated": "2013-12-18T21:29:24.187Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.117Z", 
+        "created": "2013-12-18T21:29:07.412Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58718, 
+    "pk": 60518, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.287Z", 
+        "updated": "2013-12-18T21:29:24.294Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.125Z", 
+        "created": "2013-12-18T21:29:07.420Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58719, 
+    "pk": 60519, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.378Z", 
+        "updated": "2013-12-18T21:29:24.402Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.134Z", 
+        "created": "2013-12-18T21:29:07.428Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58720, 
+    "pk": 60520, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.469Z", 
+        "updated": "2013-12-18T21:29:24.510Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.142Z", 
+        "created": "2013-12-18T21:29:07.436Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58721, 
+    "pk": 60521, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.561Z", 
+        "updated": "2013-12-18T21:29:24.626Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.150Z", 
+        "created": "2013-12-18T21:29:07.445Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58722, 
+    "pk": 60522, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.652Z", 
+        "updated": "2013-12-18T21:29:24.734Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.158Z", 
+        "created": "2013-12-18T21:29:07.453Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58723, 
+    "pk": 60523, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.743Z", 
+        "updated": "2013-12-18T21:29:24.841Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.167Z", 
+        "created": "2013-12-18T21:29:07.461Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58724, 
+    "pk": 60524, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.834Z", 
+        "updated": "2013-12-18T21:29:24.949Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.175Z", 
+        "created": "2013-12-18T21:29:07.470Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58725, 
+    "pk": 60525, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.925Z", 
+        "updated": "2013-12-18T21:29:25.057Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.183Z", 
+        "created": "2013-12-18T21:29:07.478Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58726, 
+    "pk": 60526, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.016Z", 
+        "updated": "2013-12-18T21:29:25.164Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.192Z", 
+        "created": "2013-12-18T21:29:07.497Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58727, 
+    "pk": 60527, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.107Z", 
+        "updated": "2013-12-18T21:29:25.272Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.200Z", 
+        "created": "2013-12-18T21:29:07.547Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58728, 
+    "pk": 60528, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.198Z", 
+        "updated": "2013-12-18T21:29:25.380Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.208Z", 
+        "created": "2013-12-18T21:29:07.561Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58729, 
+    "pk": 60529, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.290Z", 
+        "updated": "2013-12-18T21:29:25.487Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.216Z", 
+        "created": "2013-12-18T21:29:07.569Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58730, 
+    "pk": 60530, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.381Z", 
+        "updated": "2013-12-18T21:29:25.595Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.225Z", 
+        "created": "2013-12-18T21:29:07.577Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58731, 
+    "pk": 60531, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.473Z", 
+        "updated": "2013-12-18T21:29:25.703Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.233Z", 
+        "created": "2013-12-18T21:29:07.586Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58732, 
+    "pk": 60532, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.565Z", 
+        "updated": "2013-12-18T21:29:25.810Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.241Z", 
+        "created": "2013-12-18T21:29:07.594Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58733, 
+    "pk": 60533, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.656Z", 
+        "updated": "2013-12-18T21:29:25.918Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.250Z", 
+        "created": "2013-12-18T21:29:07.602Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58734, 
+    "pk": 60534, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.747Z", 
+        "updated": "2013-12-18T21:29:26.026Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.258Z", 
+        "created": "2013-12-18T21:29:07.610Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58735, 
+    "pk": 60535, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.830Z", 
+        "updated": "2013-12-18T21:29:26.133Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.266Z", 
+        "created": "2013-12-18T21:29:07.619Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58736, 
+    "pk": 60536, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.929Z", 
+        "updated": "2013-12-18T21:29:26.241Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.274Z", 
+        "created": "2013-12-18T21:29:07.627Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58737, 
+    "pk": 60537, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.020Z", 
+        "updated": "2013-12-18T21:29:26.349Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.283Z", 
+        "created": "2013-12-18T21:29:07.635Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58738, 
+    "pk": 60538, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.111Z", 
+        "updated": "2013-12-18T21:29:26.456Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.291Z", 
+        "created": "2013-12-18T21:29:07.644Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58739, 
+    "pk": 60539, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.203Z", 
+        "updated": "2013-12-18T21:29:26.564Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.299Z", 
+        "created": "2013-12-18T21:29:07.652Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58740, 
+    "pk": 60540, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.294Z", 
+        "updated": "2013-12-18T21:29:26.672Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.308Z", 
+        "created": "2013-12-18T21:29:07.660Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58741, 
+    "pk": 60541, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.385Z", 
+        "updated": "2013-12-18T21:29:26.780Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.316Z", 
+        "created": "2013-12-18T21:29:07.669Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58742, 
+    "pk": 60542, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.476Z", 
+        "updated": "2013-12-18T21:29:26.896Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.324Z", 
+        "created": "2013-12-18T21:29:07.677Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58743, 
+    "pk": 60543, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.567Z", 
+        "updated": "2013-12-18T21:29:27.003Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.333Z", 
+        "created": "2013-12-18T21:29:07.685Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58744, 
+    "pk": 60544, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.658Z", 
+        "updated": "2013-12-18T21:29:27.111Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.341Z", 
+        "created": "2013-12-18T21:29:07.693Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58745, 
+    "pk": 60545, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.749Z", 
+        "updated": "2013-12-18T21:29:27.219Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.349Z", 
+        "created": "2013-12-18T21:29:07.702Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58746, 
+    "pk": 60546, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.840Z", 
+        "updated": "2013-12-18T21:29:27.326Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.357Z", 
+        "created": "2013-12-18T21:29:07.710Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58747, 
+    "pk": 60547, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.932Z", 
+        "updated": "2013-12-18T21:29:27.434Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.366Z", 
+        "created": "2013-12-18T21:29:07.718Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58748, 
+    "pk": 60548, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.031Z", 
+        "updated": "2013-12-18T21:29:27.542Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.374Z", 
+        "created": "2013-12-18T21:29:07.726Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58749, 
+    "pk": 60549, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.129Z", 
+        "updated": "2013-12-18T21:29:27.708Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.382Z", 
+        "created": "2013-12-18T21:29:07.735Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58750, 
+    "pk": 60550, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.220Z", 
+        "updated": "2013-12-18T21:29:27.815Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.391Z", 
+        "created": "2013-12-18T21:29:07.743Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58751, 
+    "pk": 60551, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.311Z", 
+        "updated": "2013-12-18T21:29:27.923Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.399Z", 
+        "created": "2013-12-18T21:29:07.751Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58752, 
+    "pk": 60552, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.402Z", 
+        "updated": "2013-12-18T21:29:28.030Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.407Z", 
+        "created": "2013-12-18T21:29:07.760Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58753, 
+    "pk": 60553, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.493Z", 
+        "updated": "2013-12-18T21:29:28.138Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.415Z", 
+        "created": "2013-12-18T21:29:07.768Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58754, 
+    "pk": 60554, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.584Z", 
+        "updated": "2013-12-18T21:29:28.246Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.424Z", 
+        "created": "2013-12-18T21:29:07.776Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58755, 
+    "pk": 60555, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.675Z", 
+        "updated": "2013-12-18T21:29:28.354Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.432Z", 
+        "created": "2013-12-18T21:29:07.784Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58756, 
+    "pk": 60556, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.766Z", 
+        "updated": "2013-12-18T21:29:28.461Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.440Z", 
+        "created": "2013-12-18T21:29:07.793Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58757, 
+    "pk": 60557, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.448Z", 
+        "updated": "2013-12-18T21:29:28.569Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.448Z", 
+        "created": "2013-12-18T21:29:07.801Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58758, 
+    "pk": 60558, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.457Z", 
+        "updated": "2013-12-18T21:29:28.677Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.457Z", 
+        "created": "2013-12-18T21:29:07.809Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58759, 
+    "pk": 60559, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.465Z", 
+        "updated": "2013-12-18T21:29:28.784Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.465Z", 
+        "created": "2013-12-18T21:29:07.817Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58760, 
+    "pk": 60560, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.473Z", 
+        "updated": "2013-12-18T21:29:28.892Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.473Z", 
+        "created": "2013-12-18T21:29:07.826Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58761, 
+    "pk": 60561, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.482Z", 
+        "updated": "2013-12-18T21:29:29Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.482Z", 
+        "created": "2013-12-18T21:29:07.834Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58762, 
+    "pk": 60562, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.490Z", 
+        "updated": "2013-12-18T21:29:29.107Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.490Z", 
+        "created": "2013-12-18T21:29:07.842Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58763, 
+    "pk": 60563, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.498Z", 
+        "updated": "2013-12-18T21:29:07.851Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.498Z", 
+        "created": "2013-12-18T21:29:07.851Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58764, 
+    "pk": 60564, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.506Z", 
+        "updated": "2013-12-18T21:29:07.859Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.506Z", 
+        "created": "2013-12-18T21:29:07.859Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58765, 
+    "pk": 60565, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.515Z", 
+        "updated": "2013-12-18T21:29:07.867Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.515Z", 
+        "created": "2013-12-18T21:29:07.867Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58766, 
+    "pk": 60566, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.523Z", 
+        "updated": "2013-12-18T21:29:07.875Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.523Z", 
+        "created": "2013-12-18T21:29:07.875Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58767, 
+    "pk": 60567, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.531Z", 
+        "updated": "2013-12-18T21:29:07.884Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.531Z", 
+        "created": "2013-12-18T21:29:07.884Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58768, 
+    "pk": 60568, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.540Z", 
+        "updated": "2013-12-18T21:29:07.892Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.540Z", 
+        "created": "2013-12-18T21:29:07.892Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58769, 
+    "pk": 60569, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.548Z", 
+        "updated": "2013-12-18T21:29:07.900Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.548Z", 
+        "created": "2013-12-18T21:29:07.900Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58770, 
+    "pk": 60570, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:46.556Z", 
+        "updated": "2013-12-18T21:29:07.909Z", 
         "slice": 8, 
-        "created": "2013-12-13T22:19:46.556Z", 
+        "created": "2013-12-18T21:29:07.909Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58771, 
+    "pk": 60571, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.490Z", 
+        "updated": "2013-12-18T21:29:20.268Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.577Z", 
+        "created": "2013-12-18T21:29:07.929Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58772, 
+    "pk": 60572, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.581Z", 
+        "updated": "2013-12-18T21:29:20.376Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.589Z", 
+        "created": "2013-12-18T21:29:07.942Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58773, 
+    "pk": 60573, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.672Z", 
+        "updated": "2013-12-18T21:29:20.484Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.597Z", 
+        "created": "2013-12-18T21:29:07.950Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58774, 
+    "pk": 60574, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.764Z", 
+        "updated": "2013-12-18T21:29:20.591Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.606Z", 
+        "created": "2013-12-18T21:29:07.958Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58775, 
+    "pk": 60575, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.855Z", 
+        "updated": "2013-12-18T21:29:20.699Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.614Z", 
+        "created": "2013-12-18T21:29:07.967Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58776, 
+    "pk": 60576, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.963Z", 
+        "updated": "2013-12-18T21:29:20.807Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.622Z", 
+        "created": "2013-12-18T21:29:07.975Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58777, 
+    "pk": 60577, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.054Z", 
+        "updated": "2013-12-18T21:29:20.914Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.631Z", 
+        "created": "2013-12-18T21:29:07.983Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58778, 
+    "pk": 60578, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.145Z", 
+        "updated": "2013-12-18T21:29:21.022Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.639Z", 
+        "created": "2013-12-18T21:29:07.991Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58779, 
+    "pk": 60579, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.236Z", 
+        "updated": "2013-12-18T21:29:21.130Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.647Z", 
+        "created": "2013-12-18T21:29:08Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58780, 
+    "pk": 60580, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.328Z", 
+        "updated": "2013-12-18T21:29:21.238Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.656Z", 
+        "created": "2013-12-18T21:29:08.008Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58781, 
+    "pk": 60581, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.419Z", 
+        "updated": "2013-12-18T21:29:21.345Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.664Z", 
+        "created": "2013-12-18T21:29:08.016Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58782, 
+    "pk": 60582, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.510Z", 
+        "updated": "2013-12-18T21:29:21.453Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.672Z", 
+        "created": "2013-12-18T21:29:08.025Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58783, 
+    "pk": 60583, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.601Z", 
+        "updated": "2013-12-18T21:29:21.561Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.680Z", 
+        "created": "2013-12-18T21:29:08.033Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58784, 
+    "pk": 60584, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.712Z", 
+        "updated": "2013-12-18T21:29:21.668Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.689Z", 
+        "created": "2013-12-18T21:29:08.041Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58785, 
+    "pk": 60585, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.803Z", 
+        "updated": "2013-12-18T21:29:21.776Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.697Z", 
+        "created": "2013-12-18T21:29:08.049Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58786, 
+    "pk": 60586, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.894Z", 
+        "updated": "2013-12-18T21:29:21.884Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.705Z", 
+        "created": "2013-12-18T21:29:08.058Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58787, 
+    "pk": 60587, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.985Z", 
+        "updated": "2013-12-18T21:29:21.991Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.713Z", 
+        "created": "2013-12-18T21:29:08.066Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58788, 
+    "pk": 60588, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.077Z", 
+        "updated": "2013-12-18T21:29:22.099Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.722Z", 
+        "created": "2013-12-18T21:29:08.074Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58789, 
+    "pk": 60589, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.135Z", 
+        "updated": "2013-12-18T21:29:22.207Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.730Z", 
+        "created": "2013-12-18T21:29:08.082Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58790, 
+    "pk": 60590, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.226Z", 
+        "updated": "2013-12-18T21:29:22.323Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.738Z", 
+        "created": "2013-12-18T21:29:08.091Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58791, 
+    "pk": 60591, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.317Z", 
+        "updated": "2013-12-18T21:29:22.431Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.747Z", 
+        "created": "2013-12-18T21:29:08.099Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58792, 
+    "pk": 60592, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.410Z", 
+        "updated": "2013-12-18T21:29:22.538Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.755Z", 
+        "created": "2013-12-18T21:29:08.107Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58793, 
+    "pk": 60593, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.501Z", 
+        "updated": "2013-12-18T21:29:22.687Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.763Z", 
+        "created": "2013-12-18T21:29:08.116Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58794, 
+    "pk": 60594, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.602Z", 
+        "updated": "2013-12-18T21:29:22.795Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.771Z", 
+        "created": "2013-12-18T21:29:08.124Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58795, 
+    "pk": 60595, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.700Z", 
+        "updated": "2013-12-18T21:29:22.903Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.780Z", 
+        "created": "2013-12-18T21:29:08.132Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58796, 
+    "pk": 60596, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.792Z", 
+        "updated": "2013-12-18T21:29:23.010Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.788Z", 
+        "created": "2013-12-18T21:29:08.141Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58797, 
+    "pk": 60597, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.883Z", 
+        "updated": "2013-12-18T21:29:23.118Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.797Z", 
+        "created": "2013-12-18T21:29:08.149Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58798, 
+    "pk": 60598, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.999Z", 
+        "updated": "2013-12-18T21:29:23.226Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.805Z", 
+        "created": "2013-12-18T21:29:08.157Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58799, 
+    "pk": 60599, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.090Z", 
+        "updated": "2013-12-18T21:29:23.333Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.813Z", 
+        "created": "2013-12-18T21:29:08.166Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58800, 
+    "pk": 60600, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.181Z", 
+        "updated": "2013-12-18T21:29:23.441Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.821Z", 
+        "created": "2013-12-18T21:29:08.174Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58801, 
+    "pk": 60601, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.347Z", 
+        "updated": "2013-12-18T21:29:23.549Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.830Z", 
+        "created": "2013-12-18T21:29:08.182Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58802, 
+    "pk": 60602, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.719Z", 
+        "updated": "2013-12-18T21:29:23.657Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.838Z", 
+        "created": "2013-12-18T21:29:08.190Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58803, 
+    "pk": 60603, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.810Z", 
+        "updated": "2013-12-18T21:29:23.764Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.846Z", 
+        "created": "2013-12-18T21:29:08.199Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58804, 
+    "pk": 60604, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.901Z", 
+        "updated": "2013-12-18T21:29:23.872Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.854Z", 
+        "created": "2013-12-18T21:29:08.207Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58805, 
+    "pk": 60605, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.001Z", 
+        "updated": "2013-12-18T21:29:23.980Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.863Z", 
+        "created": "2013-12-18T21:29:08.215Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58806, 
+    "pk": 60606, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.092Z", 
+        "updated": "2013-12-18T21:29:24.087Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.871Z", 
+        "created": "2013-12-18T21:29:08.224Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58807, 
+    "pk": 60607, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.183Z", 
+        "updated": "2013-12-18T21:29:24.195Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.879Z", 
+        "created": "2013-12-18T21:29:08.232Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58808, 
+    "pk": 60608, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.279Z", 
+        "updated": "2013-12-18T21:29:24.303Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.888Z", 
+        "created": "2013-12-18T21:29:08.240Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58809, 
+    "pk": 60609, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.370Z", 
+        "updated": "2013-12-18T21:29:24.410Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.896Z", 
+        "created": "2013-12-18T21:29:08.249Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58810, 
+    "pk": 60610, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.461Z", 
+        "updated": "2013-12-18T21:29:24.518Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.904Z", 
+        "created": "2013-12-18T21:29:08.257Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58811, 
+    "pk": 60611, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.552Z", 
+        "updated": "2013-12-18T21:29:24.634Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.912Z", 
+        "created": "2013-12-18T21:29:08.265Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58812, 
+    "pk": 60612, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.643Z", 
+        "updated": "2013-12-18T21:29:24.742Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.921Z", 
+        "created": "2013-12-18T21:29:08.273Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58813, 
+    "pk": 60613, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.735Z", 
+        "updated": "2013-12-18T21:29:24.849Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.929Z", 
+        "created": "2013-12-18T21:29:08.282Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58814, 
+    "pk": 60614, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.826Z", 
+        "updated": "2013-12-18T21:29:24.957Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.937Z", 
+        "created": "2013-12-18T21:29:08.290Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58815, 
+    "pk": 60615, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.917Z", 
+        "updated": "2013-12-18T21:29:25.065Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.945Z", 
+        "created": "2013-12-18T21:29:08.298Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58816, 
+    "pk": 60616, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.008Z", 
+        "updated": "2013-12-18T21:29:25.173Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.954Z", 
+        "created": "2013-12-18T21:29:08.306Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58817, 
+    "pk": 60617, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.091Z", 
+        "updated": "2013-12-18T21:29:25.280Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.962Z", 
+        "created": "2013-12-18T21:29:08.315Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58818, 
+    "pk": 60618, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.182Z", 
+        "updated": "2013-12-18T21:29:25.388Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.970Z", 
+        "created": "2013-12-18T21:29:08.323Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58819, 
+    "pk": 60619, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.273Z", 
+        "updated": "2013-12-18T21:29:25.496Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.979Z", 
+        "created": "2013-12-18T21:29:08.331Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58820, 
+    "pk": 60620, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.364Z", 
+        "updated": "2013-12-18T21:29:25.603Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.987Z", 
+        "created": "2013-12-18T21:29:08.339Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58821, 
+    "pk": 60621, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.457Z", 
+        "updated": "2013-12-18T21:29:25.711Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:46.995Z", 
+        "created": "2013-12-18T21:29:08.348Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58822, 
+    "pk": 60622, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.548Z", 
+        "updated": "2013-12-18T21:29:25.819Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.004Z", 
+        "created": "2013-12-18T21:29:08.356Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58823, 
+    "pk": 60623, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.639Z", 
+        "updated": "2013-12-18T21:29:25.926Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.012Z", 
+        "created": "2013-12-18T21:29:08.364Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58824, 
+    "pk": 60624, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.730Z", 
+        "updated": "2013-12-18T21:29:26.034Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.020Z", 
+        "created": "2013-12-18T21:29:08.373Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58825, 
+    "pk": 60625, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.813Z", 
+        "updated": "2013-12-18T21:29:26.142Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.028Z", 
+        "created": "2013-12-18T21:29:08.381Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58826, 
+    "pk": 60626, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.913Z", 
+        "updated": "2013-12-18T21:29:26.249Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.037Z", 
+        "created": "2013-12-18T21:29:08.389Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58827, 
+    "pk": 60627, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.004Z", 
+        "updated": "2013-12-18T21:29:26.357Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.045Z", 
+        "created": "2013-12-18T21:29:08.397Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58828, 
+    "pk": 60628, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.095Z", 
+        "updated": "2013-12-18T21:29:26.465Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.053Z", 
+        "created": "2013-12-18T21:29:08.406Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58829, 
+    "pk": 60629, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.186Z", 
+        "updated": "2013-12-18T21:29:26.572Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.061Z", 
+        "created": "2013-12-18T21:29:08.414Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58830, 
+    "pk": 60630, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.277Z", 
+        "updated": "2013-12-18T21:29:26.680Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.070Z", 
+        "created": "2013-12-18T21:29:08.422Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58831, 
+    "pk": 60631, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.368Z", 
+        "updated": "2013-12-18T21:29:26.788Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.078Z", 
+        "created": "2013-12-18T21:29:08.431Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58832, 
+    "pk": 60632, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.459Z", 
+        "updated": "2013-12-18T21:29:26.904Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.086Z", 
+        "created": "2013-12-18T21:29:08.439Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58833, 
+    "pk": 60633, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.550Z", 
+        "updated": "2013-12-18T21:29:27.011Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.095Z", 
+        "created": "2013-12-18T21:29:08.447Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58834, 
+    "pk": 60634, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.642Z", 
+        "updated": "2013-12-18T21:29:27.119Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.103Z", 
+        "created": "2013-12-18T21:29:08.455Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58835, 
+    "pk": 60635, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.733Z", 
+        "updated": "2013-12-18T21:29:27.227Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.111Z", 
+        "created": "2013-12-18T21:29:08.464Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58836, 
+    "pk": 60636, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.824Z", 
+        "updated": "2013-12-18T21:29:27.335Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.119Z", 
+        "created": "2013-12-18T21:29:08.472Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58837, 
+    "pk": 60637, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.915Z", 
+        "updated": "2013-12-18T21:29:27.442Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.128Z", 
+        "created": "2013-12-18T21:29:08.480Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58838, 
+    "pk": 60638, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.014Z", 
+        "updated": "2013-12-18T21:29:27.550Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.136Z", 
+        "created": "2013-12-18T21:29:08.489Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58839, 
+    "pk": 60639, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.112Z", 
+        "updated": "2013-12-18T21:29:27.716Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.144Z", 
+        "created": "2013-12-18T21:29:08.497Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58840, 
+    "pk": 60640, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.203Z", 
+        "updated": "2013-12-18T21:29:27.823Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.153Z", 
+        "created": "2013-12-18T21:29:08.505Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58841, 
+    "pk": 60641, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.294Z", 
+        "updated": "2013-12-18T21:29:27.931Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.161Z", 
+        "created": "2013-12-18T21:29:08.513Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58842, 
+    "pk": 60642, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.385Z", 
+        "updated": "2013-12-18T21:29:28.039Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.169Z", 
+        "created": "2013-12-18T21:29:08.522Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58843, 
+    "pk": 60643, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.477Z", 
+        "updated": "2013-12-18T21:29:28.147Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.177Z", 
+        "created": "2013-12-18T21:29:08.530Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58844, 
+    "pk": 60644, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.568Z", 
+        "updated": "2013-12-18T21:29:28.254Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.186Z", 
+        "created": "2013-12-18T21:29:08.538Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58845, 
+    "pk": 60645, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.659Z", 
+        "updated": "2013-12-18T21:29:28.362Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.194Z", 
+        "created": "2013-12-18T21:29:08.546Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58846, 
+    "pk": 60646, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.750Z", 
+        "updated": "2013-12-18T21:29:28.469Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.202Z", 
+        "created": "2013-12-18T21:29:08.555Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58847, 
+    "pk": 60647, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.211Z", 
+        "updated": "2013-12-18T21:29:28.577Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.211Z", 
+        "created": "2013-12-18T21:29:08.563Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58848, 
+    "pk": 60648, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.219Z", 
+        "updated": "2013-12-18T21:29:28.685Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.219Z", 
+        "created": "2013-12-18T21:29:08.571Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58849, 
+    "pk": 60649, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.227Z", 
+        "updated": "2013-12-18T21:29:28.793Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.227Z", 
+        "created": "2013-12-18T21:29:08.580Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58850, 
+    "pk": 60650, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.236Z", 
+        "updated": "2013-12-18T21:29:28.900Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.236Z", 
+        "created": "2013-12-18T21:29:08.588Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58851, 
+    "pk": 60651, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.244Z", 
+        "updated": "2013-12-18T21:29:29.008Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.244Z", 
+        "created": "2013-12-18T21:29:08.596Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58852, 
+    "pk": 60652, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.252Z", 
+        "updated": "2013-12-18T21:29:29.116Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.252Z", 
+        "created": "2013-12-18T21:29:08.605Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
-        "state": "pending", 
+        "object": 112
+        "account": 15
+        "state": "invoiced", 
         "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "reservation"
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58853, 
+    "pk": 60653, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.260Z", 
+        "updated": "2013-12-18T21:29:08.613Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.260Z", 
+        "created": "2013-12-18T21:29:08.613Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58854, 
+    "pk": 60654, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.269Z", 
+        "updated": "2013-12-18T21:29:08.621Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.269Z", 
+        "created": "2013-12-18T21:29:08.621Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58855, 
+    "pk": 60655, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.277Z", 
+        "updated": "2013-12-18T21:29:08.630Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.277Z", 
+        "created": "2013-12-18T21:29:08.629Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58856, 
+    "pk": 60656, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.285Z", 
+        "updated": "2013-12-18T21:29:08.638Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.285Z", 
+        "created": "2013-12-18T21:29:08.638Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58857, 
+    "pk": 60657, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.294Z", 
+        "updated": "2013-12-18T21:29:08.646Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.294Z", 
+        "created": "2013-12-18T21:29:08.646Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58858, 
+    "pk": 60658, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.302Z", 
+        "updated": "2013-12-18T21:29:08.654Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.302Z", 
+        "created": "2013-12-18T21:29:08.654Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58859, 
+    "pk": 60659, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.310Z", 
+        "updated": "2013-12-18T21:29:08.663Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.310Z", 
+        "created": "2013-12-18T21:29:08.663Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58860, 
+    "pk": 60660, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.318Z", 
+        "updated": "2013-12-18T21:29:08.671Z", 
         "slice": 9, 
-        "created": "2013-12-13T22:19:47.318Z", 
+        "created": "2013-12-18T21:29:08.671Z", 
         "amount": 0.56, 
-        "object": 93
-        "account": 13
+        "object": 112
+        "account": 15
         "state": "pending", 
         "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 58861, 
+    "pk": 60661, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.449Z", 
+        "updated": "2013-12-18T21:29:29.215Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.350Z", 
-        "amount": 0.336
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.698Z", 
+        "amount": 0.1848
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 73, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58862, 
+    "pk": 60662, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.540Z", 
+        "updated": "2013-12-18T21:29:29.240Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.360Z", 
-        "amount": 0.3024
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.704Z", 
+        "amount": 0.2072
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 74, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58863, 
+    "pk": 60663, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.631Z", 
+        "updated": "2013-12-18T21:29:29.256Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.368Z", 
-        "amount": 0.2016
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.712Z", 
+        "amount": 0.3248
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 74, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58864, 
+    "pk": 60664, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.722Z", 
+        "updated": "2013-12-18T21:29:29.273Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.376Z", 
-        "amount": 0.2912, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.721Z", 
+        "amount": 0.2352, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 74, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58865, 
+    "pk": 60665, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.813Z", 
+        "updated": "2013-12-18T21:29:29.290Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.385Z", 
-        "amount": 0.2632
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.729Z", 
+        "amount": 0.3304
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 74, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58866, 
+    "pk": 60666, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.904Z", 
+        "updated": "2013-12-18T21:29:29.306Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.393Z", 
-        "amount": 0.2016
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.737Z", 
+        "amount": 0.308
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 74, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58867, 
+    "pk": 60667, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.013Z", 
+        "updated": "2013-12-18T21:29:29.323Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.401Z", 
-        "amount": 0.252, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.745Z", 
+        "amount": 0.1232, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 74, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58868, 
+    "pk": 60668, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.104Z", 
+        "updated": "2013-12-18T21:29:29.339Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.410Z", 
-        "amount": 0.1456
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.754Z", 
+        "amount": 0.1568
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 74, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58869, 
+    "pk": 60669, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.195Z", 
+        "updated": "2013-12-18T21:29:29.356Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.418Z", 
-        "amount": 0.1512
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.762Z", 
+        "amount": 0.2744
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 74, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58870, 
+    "pk": 60670, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.286Z", 
+        "updated": "2013-12-18T21:29:29.372Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.426Z", 
-        "amount": 0.2688
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.770Z", 
+        "amount": 0.2184
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 74, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58871, 
+    "pk": 60671, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.369Z", 
+        "updated": "2013-12-18T21:29:29.389Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.434Z", 
-        "amount": 0.168
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.779Z", 
+        "amount": 0.2184
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 74, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58872, 
+    "pk": 60672, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.460Z", 
+        "updated": "2013-12-18T21:29:29.406Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.443Z", 
-        "amount": 0.2856
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.787Z", 
+        "amount": 0.14
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 74, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58873, 
+    "pk": 60673, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.551Z", 
+        "updated": "2013-12-18T21:29:29.424Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.451Z", 
-        "amount": 0.3192, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.795Z", 
+        "amount": 0.2352, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 74, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58874, 
+    "pk": 60674, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.651Z", 
+        "updated": "2013-12-18T21:29:29.440Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.459Z", 
-        "amount": 0.3192, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.803Z", 
+        "amount": 0.1232, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 74, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58875, 
+    "pk": 60675, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.753Z", 
+        "updated": "2013-12-18T21:29:29.457Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.467Z", 
-        "amount": 0.196, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.812Z", 
+        "amount": 0.2016, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 74, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58876, 
+    "pk": 60676, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.845Z", 
+        "updated": "2013-12-18T21:29:29.473Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.476Z", 
-        "amount": 0.196
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.820Z", 
+        "amount": 0.28
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 74, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58877, 
+    "pk": 60677, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.936Z", 
+        "updated": "2013-12-18T21:29:29.490Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.484Z", 
-        "amount": 0.168, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.828Z", 
+        "amount": 0.2408, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 74, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58878, 
+    "pk": 60678, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.027Z", 
+        "updated": "2013-12-18T21:29:29.507Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.492Z", 
+        "created": "2013-12-18T21:29:08.837Z", 
         "amount": 0.2072, 
-        "object": 94
-        "account": 13
+        "object": 105
+        "account": 16
         "state": "invoiced", 
         "coreHours": 2.96, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 74, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58879, 
+    "pk": 60679, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.118Z", 
+        "updated": "2013-12-18T21:29:29.523Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.501Z", 
-        "amount": 0.1792
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.845Z", 
+        "amount": 0.2296
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 74, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58880, 
+    "pk": 60680, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.209Z", 
+        "updated": "2013-12-18T21:29:29.548Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.509Z", 
-        "amount": 0.2464
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.853Z", 
+        "amount": 0.28
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 75, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58881, 
+    "pk": 60681, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.300Z", 
+        "updated": "2013-12-18T21:29:29.565Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.517Z", 
-        "amount": 0.2296
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.861Z", 
+        "amount": 0.3024
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 75, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58882, 
+    "pk": 60682, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.394Z", 
+        "updated": "2013-12-18T21:29:29.581Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.525Z", 
-        "amount": 0.2576
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.870Z", 
+        "amount": 0.1512
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 75, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58883, 
+    "pk": 60683, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.485Z", 
+        "updated": "2013-12-18T21:29:29.598Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.534Z", 
-        "amount": 0.2968
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.878Z", 
+        "amount": 0.196
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 75, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58884, 
+    "pk": 60684, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.576Z", 
+        "updated": "2013-12-18T21:29:29.614Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.542Z", 
-        "amount": 0.2072, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.886Z", 
+        "amount": 0.112, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 75, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58885, 
+    "pk": 60685, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.684Z", 
+        "updated": "2013-12-18T21:29:29.631Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.550Z", 
-        "amount": 0.1288, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.894Z", 
+        "amount": 0.2688, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 75, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58886, 
+    "pk": 60686, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.775Z", 
+        "updated": "2013-12-18T21:29:29.648Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.559Z", 
-        "amount": 0.1624
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.903Z", 
+        "amount": 0.336
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 75, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58887, 
+    "pk": 60687, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.866Z", 
+        "updated": "2013-12-18T21:29:29.664Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.567Z", 
-        "amount": 0.3248
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.911Z", 
+        "amount": 0.2296
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 75, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58888, 
+    "pk": 60688, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.982Z", 
+        "updated": "2013-12-18T21:29:29.681Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.575Z", 
-        "amount": 0.3248
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.919Z", 
+        "amount": 0.2912
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 75, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58889, 
+    "pk": 60689, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.073Z", 
+        "updated": "2013-12-18T21:29:29.697Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.583Z", 
-        "amount": 0.1848, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.928Z", 
+        "amount": 0.308, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 75, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58890, 
+    "pk": 60690, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.164Z", 
+        "updated": "2013-12-18T21:29:29.714Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.592Z", 
-        "amount": 0.3136
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.936Z", 
+        "amount": 0.308
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 75, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58891, 
+    "pk": 60691, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.330Z", 
+        "updated": "2013-12-18T21:29:29.730Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.600Z", 
-        "amount": 0.2128
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.944Z", 
+        "amount": 0.336
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 75, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58892, 
+    "pk": 60692, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.636Z", 
+        "updated": "2013-12-18T21:29:29.747Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.608Z", 
-        "amount": 0.2688
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.952Z", 
+        "amount": 0.336
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 75, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58893, 
+    "pk": 60693, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.794Z", 
+        "updated": "2013-12-18T21:29:29.763Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.616Z", 
-        "amount": 0.2968
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.961Z", 
+        "amount": 0.336
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 75, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58894, 
+    "pk": 60694, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.885Z", 
+        "updated": "2013-12-18T21:29:29.780Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.625Z", 
-        "amount": 0.168
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.969Z", 
+        "amount": 0.224
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 75, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58895, 
+    "pk": 60695, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.984Z", 
+        "updated": "2013-12-18T21:29:29.797Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.633Z", 
-        "amount": 0.3248
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.977Z", 
+        "amount": 0.3304
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 75, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58896, 
+    "pk": 60696, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.075Z", 
+        "updated": "2013-12-18T21:29:29.813Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.641Z", 
-        "amount": 0.2968
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.986Z", 
+        "amount": 0.3136
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 75, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58897, 
+    "pk": 60697, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.166Z", 
+        "updated": "2013-12-18T21:29:29.830Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.650Z", 
-        "amount": 0.2968
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:08.994Z", 
+        "amount": 0.2856
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 75, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58898, 
+    "pk": 60698, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.262Z", 
+        "updated": "2013-12-18T21:29:29.846Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.658Z", 
-        "amount": 0.2184
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.002Z", 
+        "amount": 0.336
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 75, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58899, 
+    "pk": 60699, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.354Z", 
+        "updated": "2013-12-18T21:29:29.863Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.666Z", 
-        "amount": 0.3304
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.010Z", 
+        "amount": 0.2128
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 75, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58900, 
+    "pk": 60700, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.445Z", 
+        "updated": "2013-12-18T21:29:29.879Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.674Z", 
-        "amount": 0.1568
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.019Z", 
+        "amount": 0.1456
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 75, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58901, 
+    "pk": 60701, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.536Z", 
+        "updated": "2013-12-18T21:29:29.904Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.683Z", 
-        "amount": 0.1848, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.027Z", 
+        "amount": 0.2128, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 76, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58902, 
+    "pk": 60702, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.627Z", 
+        "updated": "2013-12-18T21:29:29.921Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.691Z", 
-        "amount": 0.308
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.035Z", 
+        "amount": 0.2576
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 76, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58903, 
+    "pk": 60703, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.718Z", 
+        "updated": "2013-12-18T21:29:29.937Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.699Z", 
-        "amount": 0.336, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.044Z", 
+        "amount": 0.2856, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 76, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58904, 
+    "pk": 60704, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.809Z", 
+        "updated": "2013-12-18T21:29:29.954Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.708Z", 
-        "amount": 0.2184, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.054Z", 
+        "amount": 0.2464, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 76, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58905, 
+    "pk": 60705, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.900Z", 
+        "updated": "2013-12-18T21:29:29.971Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.716Z", 
-        "amount": 0.1904
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.060Z", 
+        "amount": 0.1736
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 76, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58906, 
+    "pk": 60706, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.991Z", 
+        "updated": "2013-12-18T21:29:29.987Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.724Z", 
-        "amount": 0.1624, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.068Z", 
+        "amount": 0.2464, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 76, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58907, 
+    "pk": 60707, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.083Z", 
+        "updated": "2013-12-18T21:29:30.004Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.733Z", 
-        "amount": 0.2072
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.077Z", 
+        "amount": 0.2744
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 76, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58908, 
+    "pk": 60708, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.174Z", 
+        "updated": "2013-12-18T21:29:30.020Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.741Z", 
-        "amount": 0.2968
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.085Z", 
+        "amount": 0.2016
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 76, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58909, 
+    "pk": 60709, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.265Z", 
+        "updated": "2013-12-18T21:29:30.037Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.749Z", 
-        "amount": 0.3024
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.093Z", 
+        "amount": 0.308
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 76, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58910, 
+    "pk": 60710, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.356Z", 
+        "updated": "2013-12-18T21:29:30.053Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.757Z", 
-        "amount": 0.2856
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.102Z", 
+        "amount": 0.1288
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 76, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58911, 
+    "pk": 60711, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.449Z", 
+        "updated": "2013-12-18T21:29:30.070Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.765Z", 
+        "created": "2013-12-18T21:29:09.110Z", 
         "amount": 0.1232, 
-        "object": 94
-        "account": 13
+        "object": 105
+        "account": 16
         "state": "invoiced", 
         "coreHours": 1.76, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 76, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58912, 
+    "pk": 60712, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.540Z", 
+        "updated": "2013-12-18T21:29:30.087Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.774Z", 
-        "amount": 0.1792
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.118Z", 
+        "amount": 0.2184
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 76, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58913, 
+    "pk": 60713, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.631Z", 
+        "updated": "2013-12-18T21:29:30.103Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.782Z", 
-        "amount": 0.1792, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.126Z", 
+        "amount": 0.3192, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 76, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58914, 
+    "pk": 60714, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.722Z", 
+        "updated": "2013-12-18T21:29:30.120Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.791Z", 
-        "amount": 0.1344
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.135Z", 
+        "amount": 0.3192
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 76, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58915, 
+    "pk": 60715, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.805Z", 
+        "updated": "2013-12-18T21:29:30.136Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.799Z", 
-        "amount": 0.3192
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.143Z", 
+        "amount": 0.2744
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 76, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58916, 
+    "pk": 60716, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.904Z", 
+        "updated": "2013-12-18T21:29:30.153Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.807Z", 
+        "created": "2013-12-18T21:29:09.151Z", 
         "amount": 0.1232, 
-        "object": 94
-        "account": 13
+        "object": 105
+        "account": 16
         "state": "invoiced", 
         "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 76, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58917, 
+    "pk": 60717, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.995Z", 
+        "updated": "2013-12-18T21:29:30.169Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.815Z", 
-        "amount": 0.1288
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.160Z", 
+        "amount": 0.2912
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 76, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58918, 
+    "pk": 60718, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.087Z", 
+        "updated": "2013-12-18T21:29:30.186Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.824Z", 
-        "amount": 0.2912
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.168Z", 
+        "amount": 0.3304
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 76, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58919, 
+    "pk": 60719, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.178Z", 
+        "updated": "2013-12-18T21:29:30.203Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.832Z", 
-        "amount": 0.2744, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.176Z", 
+        "amount": 0.224, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 76, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58920, 
+    "pk": 60720, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.269Z", 
+        "updated": "2013-12-18T21:29:30.219Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.840Z", 
-        "amount": 0.1568
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.185Z", 
+        "amount": 0.1456
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 76, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58921, 
+    "pk": 60721, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.360Z", 
+        "updated": "2013-12-18T21:29:30.236Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.849Z", 
-        "amount": 0.2688
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.193Z", 
+        "amount": 0.3192
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 76, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58922, 
+    "pk": 60722, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.451Z", 
+        "updated": "2013-12-18T21:29:30.260Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.857Z", 
-        "amount": 0.336, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.201Z", 
+        "amount": 0.2576, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 77, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58923, 
+    "pk": 60723, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.542Z", 
+        "updated": "2013-12-18T21:29:30.277Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.865Z", 
-        "amount": 0.196
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.209Z", 
+        "amount": 0.168
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 77, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58924, 
+    "pk": 60724, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.633Z", 
+        "updated": "2013-12-18T21:29:30.294Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.873Z", 
-        "amount": 0.1176, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.218Z", 
+        "amount": 0.2856, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58925, 
+    "pk": 60725, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.724Z", 
+        "updated": "2013-12-18T21:29:30.319Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.885Z", 
-        "amount": 0.1512, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.226Z", 
+        "amount": 0.1232, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 77, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58926, 
+    "pk": 60726, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.816Z", 
+        "updated": "2013-12-18T21:29:30.335Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.893Z", 
-        "amount": 0.308, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.234Z", 
+        "amount": 0.168, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 77, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60727, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:30.352Z", 
+        "slice": 11, 
+        "created": "2013-12-18T21:29:09.243Z", 
+        "amount": 0.1792, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 2.56, 
+        "invoice": 77, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58927
+    "pk": 60728
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.907Z", 
+        "updated": "2013-12-18T21:29:30.369Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.902Z", 
+        "created": "2013-12-18T21:29:09.251Z", 
         "amount": 0.3192, 
-        "object": 94
-        "account": 13
+        "object": 105
+        "account": 16
         "state": "invoiced", 
         "coreHours": 4.56, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 77, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58928
+    "pk": 60729
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.006Z", 
+        "updated": "2013-12-18T21:29:30.385Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.910Z", 
-        "amount": 0.1904
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.259Z", 
+        "amount": 0.1736
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 77, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58929
+    "pk": 60730
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.097Z", 
+        "updated": "2013-12-18T21:29:30.402Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.918Z", 
-        "amount": 0.14
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.267Z", 
+        "amount": 0.196
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 77, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58930
+    "pk": 60731
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.195Z", 
+        "updated": "2013-12-18T21:29:30.418Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.926Z", 
-        "amount": 0.1288
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.276Z", 
+        "amount": 0.112
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 77, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58931
+    "pk": 60732
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.286Z", 
+        "updated": "2013-12-18T21:29:30.435Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.935Z", 
-        "amount": 0.1512
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.284Z", 
+        "amount": 0.2856
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58932
+    "pk": 60733
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.377Z", 
+        "updated": "2013-12-18T21:29:30.451Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.943Z", 
-        "amount": 0.252
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.292Z", 
+        "amount": 0.1568
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 77, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58933
+    "pk": 60734
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.468Z", 
+        "updated": "2013-12-18T21:29:30.468Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.951Z", 
-        "amount": 0.1232
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.300Z", 
+        "amount": 0.2408
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 77, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58934
+    "pk": 60735
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.559Z", 
+        "updated": "2013-12-18T21:29:30.485Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.960Z", 
-        "amount": 0.1232, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.309Z", 
+        "amount": 0.2912, 
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 77, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58935
+    "pk": 60736
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.651Z", 
+        "updated": "2013-12-18T21:29:30.501Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.968Z", 
+        "created": "2013-12-18T21:29:09.317Z", 
         "amount": 0.1512, 
-        "object": 94
-        "account": 13
+        "object": 105
+        "account": 16
         "state": "invoiced", 
         "coreHours": 2.16, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 77, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58936
+    "pk": 60737
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.742Z", 
+        "updated": "2013-12-18T21:29:30.518Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.976Z", 
-        "amount": 0.336
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.325Z", 
+        "amount": 0.2632
+        "object": 105
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.76, 
+        "invoice": 77, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58937
+    "pk": 60738
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.984Z", 
+        "updated": "2013-12-18T21:29:30.534Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.984Z", 
-        "amount": 0.196, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.8, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:09.334Z", 
+        "amount": 0.2744, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 3.92, 
+        "invoice": 77, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58938
+    "pk": 60739
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:47.993Z", 
+        "updated": "2013-12-18T21:29:30.551Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:47.993Z", 
-        "amount": 0.1904, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.72, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:09.342Z", 
+        "amount": 0.1512, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 2.16, 
+        "invoice": 77, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58939
+    "pk": 60740
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.001Z", 
+        "updated": "2013-12-18T21:29:30.567Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.001Z", 
-        "amount": 0.2464, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.52, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:09.350Z", 
+        "amount": 0.2856, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58940
+    "pk": 60741
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.009Z", 
+        "updated": "2013-12-18T21:29:30.584Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.009Z", 
-        "amount": 0.196, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.8, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:09.358Z", 
+        "amount": 0.2856, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58941
+    "pk": 60742
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.017Z", 
+        "updated": "2013-12-18T21:29:30.601Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.017Z", 
-        "amount": 0.1736, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 2.48, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:09.367Z", 
+        "amount": 0.3136, 
+        "object": 105, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 77, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58942
+    "pk": 60743
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.026Z", 
+        "updated": "2013-12-18T21:29:09.375Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.026Z", 
-        "amount": 0.1848
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.375Z", 
+        "amount": 0.1176
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.64
+        "coreHours": 1.68
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58943
+    "pk": 60744
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.034Z", 
+        "updated": "2013-12-18T21:29:09.383Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.034Z", 
-        "amount": 0.1568, 
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.383Z", 
+        "amount": 0.2128, 
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.24, 
+        "coreHours": 3.04, 
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58944
+    "pk": 60745
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.042Z", 
+        "updated": "2013-12-18T21:29:09.392Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.042Z", 
-        "amount": 0.1904
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.392Z", 
+        "amount": 0.28
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.72
+        "coreHours": 4.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58945
+    "pk": 60746
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.051Z", 
+        "updated": "2013-12-18T21:29:09.400Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.051Z", 
-        "amount": 0.3192
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.400Z", 
+        "amount": 0.224
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 4.56
+        "coreHours": 3.2
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58946
+    "pk": 60747
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.059Z", 
+        "updated": "2013-12-18T21:29:09.408Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.059Z", 
-        "amount": 0.1568
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.408Z", 
+        "amount": 0.2184
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.24
+        "coreHours": 3.12
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58947
+    "pk": 60748
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.067Z", 
+        "updated": "2013-12-18T21:29:09.416Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.067Z", 
-        "amount": 0.2688
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.416Z", 
+        "amount": 0.2464
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 3.84
+        "coreHours": 3.52
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58948
+    "pk": 60749
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.075Z", 
+        "updated": "2013-12-18T21:29:09.425Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.075Z", 
-        "amount": 0.2632
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.425Z", 
+        "amount": 0.308
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 3.76
+        "coreHours": 4.4
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58949
+    "pk": 60750
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.084Z", 
+        "updated": "2013-12-18T21:29:09.433Z", 
         "slice": 11, 
-        "created": "2013-12-13T22:19:48.084Z", 
-        "amount": 0.2856
-        "object": 94
-        "account": 13
+        "created": "2013-12-18T21:29:09.433Z", 
+        "amount": 0.3024
+        "object": 105
+        "account": 16
         "state": "pending", 
-        "coreHours": 4.08
+        "coreHours": 4.32
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58950
+    "pk": 60751
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.092Z", 
-        "slice": 11, 
-        "created": "2013-12-13T22:19:48.092Z", 
-        "amount": 0.336, 
-        "object": 94, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.8, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.232Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:29:09.456Z", 
+        "amount": 0.2352, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 74, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58951
+    "pk": 60752
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.440Z", 
+        "updated": "2013-12-18T21:29:29.248Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.115Z", 
-        "amount": 0.2296
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.466Z", 
+        "amount": 0.308
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 74, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58952
+    "pk": 60753
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.532Z", 
+        "updated": "2013-12-18T21:29:29.265Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.125Z", 
-        "amount": 0.2352
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.474Z", 
+        "amount": 0.2576
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 74, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58953
+    "pk": 60754
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.623Z", 
+        "updated": "2013-12-18T21:29:29.281Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.133Z", 
-        "amount": 0.308
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.483Z", 
+        "amount": 0.3192
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 74, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58954
+    "pk": 60755
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.714Z", 
+        "updated": "2013-12-18T21:29:29.298Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.142Z", 
-        "amount": 0.252
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.491Z", 
+        "amount": 0.1904
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 74, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58955
+    "pk": 60756
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.805Z", 
+        "updated": "2013-12-18T21:29:29.314Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.150Z", 
-        "amount": 0.308, 
-        "object": 95, 
-        "account": 13, 
+        "created": "2013-12-18T21:29:09.499Z", 
+        "amount": 0.3136, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 74, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
+    }
+},
+{
+    "pk": 60757, 
+    "model": "core.charge", 
+    "fields": {
+        "updated": "2013-12-18T21:29:29.331Z", 
+        "slice": 12, 
+        "created": "2013-12-18T21:29:09.508Z", 
+        "amount": 0.1176, 
+        "object": 113, 
+        "account": 16, 
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 74, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58956
+    "pk": 60758
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.896Z", 
+        "updated": "2013-12-18T21:29:29.347Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.158Z", 
-        "amount": 0.3024
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.516Z", 
+        "amount": 0.28
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 74, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58957
+    "pk": 60759
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.004Z", 
+        "updated": "2013-12-18T21:29:29.364Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.167Z", 
-        "amount": 0.1456
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.524Z", 
+        "amount": 0.1232
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 74, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58958
+    "pk": 60760
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.096Z", 
+        "updated": "2013-12-18T21:29:29.381Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.175Z", 
-        "amount": 0.2912
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.532Z", 
+        "amount": 0.3136
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 74, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58959
+    "pk": 60761
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.187Z", 
+        "updated": "2013-12-18T21:29:29.397Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.183Z", 
-        "amount": 0.1232
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.541Z", 
+        "amount": 0.1456
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 74, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58960
+    "pk": 60762
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.278Z", 
+        "updated": "2013-12-18T21:29:29.414Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.191Z", 
-        "amount": 0.2184
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.549Z", 
+        "amount": 0.2576
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 74, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58961
+    "pk": 60763
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.361Z", 
+        "updated": "2013-12-18T21:29:29.432Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.200Z", 
-        "amount": 0.2352
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.557Z", 
+        "amount": 0.2016
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 74, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58962
+    "pk": 60764
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.452Z", 
+        "updated": "2013-12-18T21:29:29.448Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.208Z", 
-        "amount": 0.2016
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.565Z", 
+        "amount": 0.3024
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 74, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58963
+    "pk": 60765
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.543Z", 
+        "updated": "2013-12-18T21:29:29.465Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.216Z", 
-        "amount": 0.1512
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.574Z", 
+        "amount": 0.3136
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 74, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58964
+    "pk": 60766
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.642Z", 
+        "updated": "2013-12-18T21:29:29.482Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.224Z", 
-        "amount": 0.2296
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.582Z", 
+        "amount": 0.2128
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 74, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58965
+    "pk": 60767
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.745Z", 
+        "updated": "2013-12-18T21:29:29.498Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.233Z", 
-        "amount": 0.308, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.590Z", 
+        "amount": 0.1848, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 74, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58966
+    "pk": 60768
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.836Z", 
+        "updated": "2013-12-18T21:29:29.515Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.241Z", 
-        "amount": 0.2408
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.599Z", 
+        "amount": 0.3136
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 74, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58967
+    "pk": 60769
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.927Z", 
+        "updated": "2013-12-18T21:29:29.531Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.249Z", 
-        "amount": 0.1512
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.607Z", 
+        "amount": 0.1456
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 74, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58968
+    "pk": 60770
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.019Z", 
+        "updated": "2013-12-18T21:29:29.556Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.258Z", 
-        "amount": 0.2016, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.615Z", 
+        "amount": 0.2576, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 75, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58969
+    "pk": 60771
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.110Z", 
+        "updated": "2013-12-18T21:29:29.573Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.266Z", 
-        "amount": 0.2744
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.623Z", 
+        "amount": 0.2912
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 75, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58970
+    "pk": 60772
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.201Z", 
+        "updated": "2013-12-18T21:29:29.589Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.274Z", 
-        "amount": 0.2184, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.632Z", 
+        "amount": 0.2744, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 75, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58971
+    "pk": 60773
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.292Z", 
+        "updated": "2013-12-18T21:29:29.606Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.283Z", 
-        "amount": 0.2016, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.640Z", 
+        "amount": 0.2296, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 75, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58972
+    "pk": 60774
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.386Z", 
+        "updated": "2013-12-18T21:29:29.623Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.291Z", 
-        "amount": 0.1792
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.649Z", 
+        "amount": 0.308
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 75, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58973
+    "pk": 60775
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.477Z", 
+        "updated": "2013-12-18T21:29:29.639Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.299Z", 
-        "amount": 0.196, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.657Z", 
+        "amount": 0.1736, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 75, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58974
+    "pk": 60776
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.568Z", 
+        "updated": "2013-12-18T21:29:29.656Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.308Z", 
-        "amount": 0.1288
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.665Z", 
+        "amount": 0.1176
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 75, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58975
+    "pk": 60777
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.675Z", 
+        "updated": "2013-12-18T21:29:29.672Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.316Z", 
-        "amount": 0.224
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.673Z", 
+        "amount": 0.1736
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 75, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58976
+    "pk": 60778
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.767Z", 
+        "updated": "2013-12-18T21:29:29.689Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.324Z", 
-        "amount": 0.1904
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.682Z", 
+        "amount": 0.2968
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 75, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58977
+    "pk": 60779
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.858Z", 
+        "updated": "2013-12-18T21:29:29.706Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.332Z", 
-        "amount": 0.3304
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.690Z", 
+        "amount": 0.252
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 75, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58978
+    "pk": 60780
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.974Z", 
+        "updated": "2013-12-18T21:29:29.722Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.341Z", 
+        "created": "2013-12-18T21:29:09.698Z", 
         "amount": 0.2632, 
-        "object": 95
-        "account": 13
+        "object": 113
+        "account": 16
         "state": "invoiced", 
         "coreHours": 3.76, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 75, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58979
+    "pk": 60781
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.065Z", 
+        "updated": "2013-12-18T21:29:29.739Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.349Z", 
-        "amount": 0.168
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.706Z", 
+        "amount": 0.1456
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 75, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58980
+    "pk": 60782
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.156Z", 
+        "updated": "2013-12-18T21:29:29.755Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.357Z", 
-        "amount": 0.2464
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.715Z", 
+        "amount": 0.1512
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 75, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58981
+    "pk": 60783
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.314Z", 
+        "updated": "2013-12-18T21:29:29.772Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.365Z", 
-        "amount": 0.196
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.723Z", 
+        "amount": 0.2072
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 75, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58982
+    "pk": 60784
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.578Z", 
+        "updated": "2013-12-18T21:29:29.788Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.374Z", 
-        "amount": 0.2408
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.731Z", 
+        "amount": 0.1624
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 75, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58983
+    "pk": 60785
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.786Z", 
+        "updated": "2013-12-18T21:29:29.805Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.382Z", 
-        "amount": 0.3192
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.740Z", 
+        "amount": 0.1848
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 75, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58984
+    "pk": 60786
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.877Z", 
+        "updated": "2013-12-18T21:29:29.821Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.390Z", 
-        "amount": 0.1848
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.748Z", 
+        "amount": 0.1176
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 75, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58985
+    "pk": 60787
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.976Z", 
+        "updated": "2013-12-18T21:29:29.838Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.399Z", 
-        "amount": 0.168
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.756Z", 
+        "amount": 0.196
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 75, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58986
+    "pk": 60788
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.067Z", 
+        "updated": "2013-12-18T21:29:29.855Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.407Z", 
-        "amount": 0.224
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.764Z", 
+        "amount": 0.1792
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 75, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58987
+    "pk": 60789
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.158Z", 
+        "updated": "2013-12-18T21:29:29.871Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.415Z", 
-        "amount": 0.1736
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.773Z", 
+        "amount": 0.2408
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 75, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58988
+    "pk": 60790
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.254Z", 
+        "updated": "2013-12-18T21:29:29.888Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.423Z", 
-        "amount": 0.308
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.781Z", 
+        "amount": 0.14
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 75, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58989
+    "pk": 60791
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.345Z", 
+        "updated": "2013-12-18T21:29:29.913Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.432Z", 
-        "amount": 0.1736
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.789Z", 
+        "amount": 0.112
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 76, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58990
+    "pk": 60792
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.436Z", 
+        "updated": "2013-12-18T21:29:29.929Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.440Z", 
-        "amount": 0.1176, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.798Z", 
+        "amount": 0.3136, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 76, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58991
+    "pk": 60793
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.527Z", 
+        "updated": "2013-12-18T21:29:29.946Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.448Z", 
-        "amount": 0.2744
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.806Z", 
+        "amount": 0.1456
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 76, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58992
+    "pk": 60794
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.619Z", 
+        "updated": "2013-12-18T21:29:29.962Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.457Z", 
-        "amount": 0.224
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.814Z", 
+        "amount": 0.2912
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 76, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58993
+    "pk": 60795
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.710Z", 
+        "updated": "2013-12-18T21:29:29.979Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.465Z", 
-        "amount": 0.1176
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.822Z", 
+        "amount": 0.2128
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 76, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58994
+    "pk": 60796
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.801Z", 
+        "updated": "2013-12-18T21:29:29.995Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.473Z", 
-        "amount": 0.2184
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.831Z", 
+        "amount": 0.1848
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 76, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58995
+    "pk": 60797
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.892Z", 
+        "updated": "2013-12-18T21:29:30.012Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.481Z", 
-        "amount": 0.1904, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.839Z", 
+        "amount": 0.3304, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 76, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58996
+    "pk": 60798
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.983Z", 
+        "updated": "2013-12-18T21:29:30.029Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.490Z", 
-        "amount": 0.196
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.847Z", 
+        "amount": 0.28
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 76, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58997
+    "pk": 60799
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.074Z", 
+        "updated": "2013-12-18T21:29:30.045Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.498Z", 
-        "amount": 0.2464
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.855Z", 
+        "amount": 0.308
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 76, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58998
+    "pk": 60800
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.165Z", 
+        "updated": "2013-12-18T21:29:30.062Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.506Z", 
-        "amount": 0.1232
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.864Z", 
+        "amount": 0.3304
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 76, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 58999
+    "pk": 60801
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.256Z", 
+        "updated": "2013-12-18T21:29:30.078Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.514Z", 
-        "amount": 0.2016
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.872Z", 
+        "amount": 0.2464
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 76, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59000
+    "pk": 60802
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.348Z", 
+        "updated": "2013-12-18T21:29:30.095Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.523Z", 
-        "amount": 0.2408
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.880Z", 
+        "amount": 0.3136
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 76, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59001
+    "pk": 60803
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.440Z", 
+        "updated": "2013-12-18T21:29:30.111Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.531Z", 
-        "amount": 0.196
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.889Z", 
+        "amount": 0.112
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 76, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59002
+    "pk": 60804
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.531Z", 
+        "updated": "2013-12-18T21:29:30.128Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.539Z", 
-        "amount": 0.1848
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.897Z", 
+        "amount": 0.2744
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 76, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59003
+    "pk": 60805
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.623Z", 
+        "updated": "2013-12-18T21:29:30.145Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.548Z", 
-        "amount": 0.252, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.905Z", 
+        "amount": 0.1792, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 76, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59004
+    "pk": 60806
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.714Z", 
+        "updated": "2013-12-18T21:29:30.161Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.556Z", 
-        "amount": 0.14
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.913Z", 
+        "amount": 0.1568
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 76, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59005
+    "pk": 60807
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.846Z", 
+        "updated": "2013-12-18T21:29:30.178Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.564Z", 
-        "amount": 0.1288, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.922Z", 
+        "amount": 0.2408, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 76, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59006
+    "pk": 60808
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.946Z", 
+        "updated": "2013-12-18T21:29:30.194Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.572Z", 
-        "amount": 0.1456, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.930Z", 
+        "amount": 0.1176, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 76, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59007
+    "pk": 60809
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.037Z", 
+        "updated": "2013-12-18T21:29:30.211Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.581Z", 
-        "amount": 0.308
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.938Z", 
+        "amount": 0.1176
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 76, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59008
+    "pk": 60810
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.128Z", 
+        "updated": "2013-12-18T21:29:30.227Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.589Z", 
-        "amount": 0.1512
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.947Z", 
+        "amount": 0.3304
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 76, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59009
+    "pk": 60811
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.219Z", 
+        "updated": "2013-12-18T21:29:30.244Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.597Z", 
-        "amount": 0.2912
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.955Z", 
+        "amount": 0.196
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 76, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59010
+    "pk": 60812
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.310Z", 
+        "updated": "2013-12-18T21:29:30.269Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.606Z", 
-        "amount": 0.1568
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.963Z", 
+        "amount": 0.2744
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 77, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59011
+    "pk": 60813
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.401Z", 
+        "updated": "2013-12-18T21:29:30.285Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.614Z", 
-        "amount": 0.3192, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.971Z", 
+        "amount": 0.1792, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 77, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59012
+    "pk": 60814
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.492Z", 
+        "updated": "2013-12-18T21:29:30.302Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.622Z", 
-        "amount": 0.1232, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.980Z", 
+        "amount": 0.112, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 77, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59013
+    "pk": 60815
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.584Z", 
+        "updated": "2013-12-18T21:29:30.327Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.630Z", 
-        "amount": 0.3248
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.988Z", 
+        "amount": 0.2296
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 77, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59014
+    "pk": 60816
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.675Z", 
+        "updated": "2013-12-18T21:29:30.344Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.639Z", 
-        "amount": 0.1344
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:09.996Z", 
+        "amount": 0.1232
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 77, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59015
+    "pk": 60817
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.766Z", 
+        "updated": "2013-12-18T21:29:30.360Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.647Z", 
-        "amount": 0.252
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.005Z", 
+        "amount": 0.1848
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 77, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59016
+    "pk": 60818
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.857Z", 
+        "updated": "2013-12-18T21:29:30.377Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.655Z", 
-        "amount": 0.2856, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.013Z", 
+        "amount": 0.2296, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 77, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59017
+    "pk": 60819
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.948Z", 
+        "updated": "2013-12-18T21:29:30.393Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.664Z", 
-        "amount": 0.196
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.021Z", 
+        "amount": 0.2968
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 77, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59018
+    "pk": 60820
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.998Z", 
+        "updated": "2013-12-18T21:29:30.410Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.672Z", 
-        "amount": 0.196
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.029Z", 
+        "amount": 0.112
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 77, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59019
+    "pk": 60821
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.089Z", 
+        "updated": "2013-12-18T21:29:30.427Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.680Z", 
-        "amount": 0.1232
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.038Z", 
+        "amount": 0.2576
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 77, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59020
+    "pk": 60822
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.187Z", 
+        "updated": "2013-12-18T21:29:30.443Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.688Z", 
-        "amount": 0.2464
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.046Z", 
+        "amount": 0.2856
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59021
+    "pk": 60823
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.278Z", 
+        "updated": "2013-12-18T21:29:30.460Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.697Z", 
-        "amount": 0.2128
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.054Z", 
+        "amount": 0.2576
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 77, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59022
+    "pk": 60824
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.369Z", 
+        "updated": "2013-12-18T21:29:30.476Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.705Z", 
-        "amount": 0.1288, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.063Z", 
+        "amount": 0.2688, 
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 77, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59023
+    "pk": 60825
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.460Z", 
+        "updated": "2013-12-18T21:29:30.493Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.713Z", 
-        "amount": 0.1904
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.071Z", 
+        "amount": 0.252
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 77, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59024
+    "pk": 60826
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.551Z", 
+        "updated": "2013-12-18T21:29:30.509Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.722Z", 
-        "amount": 0.1792
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.079Z", 
+        "amount": 0.14
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 77, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59025
+    "pk": 60827
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.642Z", 
+        "updated": "2013-12-18T21:29:30.526Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.730Z", 
-        "amount": 0.252
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.087Z", 
+        "amount": 0.3304
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 77, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59026
+    "pk": 60828
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.733Z", 
+        "updated": "2013-12-18T21:29:30.543Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.738Z", 
-        "amount": 0.2688
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.096Z", 
+        "amount": 0.3304
+        "object": 113
+        "account": 16
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 77, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59027
+    "pk": 60829
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.746Z", 
+        "updated": "2013-12-18T21:29:30.559Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.746Z", 
-        "amount": 0.2576, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 3.68, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:10.104Z", 
+        "amount": 0.1848, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 77, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59028
+    "pk": 60830
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.755Z", 
+        "updated": "2013-12-18T21:29:30.576Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.755Z", 
-        "amount": 0.2968, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.24, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:10.112Z", 
+        "amount": 0.2856, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 77, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59029
+    "pk": 60831
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.763Z", 
+        "updated": "2013-12-18T21:29:30.592Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.763Z", 
-        "amount": 0.2968, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.24, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:10.120Z", 
+        "amount": 0.2912, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 77, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59030
+    "pk": 60832
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.771Z", 
+        "updated": "2013-12-18T21:29:30.609Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.771Z", 
-        "amount": 0.3192, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.56, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:10.129Z", 
+        "amount": 0.252, 
+        "object": 113, 
+        "account": 16, 
+        "state": "invoiced", 
+        "coreHours": 3.6, 
+        "invoice": 77, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59031
+    "pk": 60833
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.780Z", 
+        "updated": "2013-12-18T21:29:10.137Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.780Z", 
-        "amount": 0.3024, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.137Z", 
+        "amount": 0.14, 
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 4.32
+        "coreHours": 2.0
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59032
+    "pk": 60834
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.788Z", 
+        "updated": "2013-12-18T21:29:10.146Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.788Z", 
-        "amount": 0.1176
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.146Z", 
+        "amount": 0.14
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 1.68
+        "coreHours": 2.0
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59033
+    "pk": 60835
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.796Z", 
+        "updated": "2013-12-18T21:29:10.154Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.796Z", 
-        "amount": 0.308
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.154Z", 
+        "amount": 0.2184
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 4.4
+        "coreHours": 3.12
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59034
+    "pk": 60836
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.805Z", 
+        "updated": "2013-12-18T21:29:10.162Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.805Z", 
-        "amount": 0.2408
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.162Z", 
+        "amount": 0.1904
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 3.44
+        "coreHours": 2.72
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59035
+    "pk": 60837
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.813Z", 
+        "updated": "2013-12-18T21:29:10.170Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.813Z", 
-        "amount": 0.1344, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.170Z", 
+        "amount": 0.1624, 
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 1.92, 
+        "coreHours": 2.32, 
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59036
+    "pk": 60838
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.821Z", 
+        "updated": "2013-12-18T21:29:10.179Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.821Z", 
-        "amount": 0.112, 
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.179Z", 
+        "amount": 0.252, 
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 1.6, 
+        "coreHours": 3.6, 
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59037
+    "pk": 60839
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.829Z", 
+        "updated": "2013-12-18T21:29:10.187Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.829Z", 
-        "amount": 0.1792
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.187Z", 
+        "amount": 0.1904
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.56
+        "coreHours": 2.72
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59038
+    "pk": 60840
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.838Z", 
+        "updated": "2013-12-18T21:29:10.195Z", 
         "slice": 12, 
-        "created": "2013-12-13T22:19:48.838Z", 
-        "amount": 0.1792
-        "object": 95
-        "account": 13
+        "created": "2013-12-18T21:29:10.195Z", 
+        "amount": 0.224
+        "object": 113
+        "account": 16
         "state": "pending", 
-        "coreHours": 2.56
+        "coreHours": 3.2
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59039
+    "pk": 60841
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.846Z", 
-        "slice": 12, 
-        "created": "2013-12-13T22:19:48.846Z", 
-        "amount": 0.3192, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.56, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.277Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.227Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59040
+    "pk": 60842
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:48.854Z", 
-        "slice": 12, 
-        "created": "2013-12-13T22:19:48.854Z", 
-        "amount": 0.3192, 
-        "object": 95, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 4.56, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.384Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.237Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59041
+    "pk": 60843
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.076Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.886Z", 
-        "amount": 0.3136, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:20.492Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.245Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 54, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59042
+    "pk": 60844
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.117Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.896Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:20.600Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.253Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 54, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59043
+    "pk": 60845
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.158Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.904Z", 
-        "amount": 0.2408
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:20.707Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.262Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 54, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59044
+    "pk": 60846
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.200Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.912Z", 
-        "amount": 0.2576, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:20.815Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.270Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 54, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59045
+    "pk": 60847
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.241Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.921Z", 
-        "amount": 0.2632
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:20.923Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.278Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 54, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59046
+    "pk": 60848
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.283Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.929Z", 
-        "amount": 0.2352
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.031Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.286Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 54, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59047
+    "pk": 60849
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.324Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.937Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.138Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.295Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 54, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59048
+    "pk": 60850
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.366Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.945Z", 
-        "amount": 0.2296, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.246Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.303Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 54, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59049
+    "pk": 60851
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.407Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.954Z", 
-        "amount": 0.1792
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.354Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.311Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 54, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59050
+    "pk": 60852
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.448Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.962Z", 
-        "amount": 0.2296, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.461Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.319Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 54, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59051
+    "pk": 60853
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.490Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.970Z", 
-        "amount": 0.3192
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.569Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.328Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 54, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59052
+    "pk": 60854
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.531Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.978Z", 
-        "amount": 0.2128
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.677Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.336Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 54, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59053
+    "pk": 60855
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.584Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.987Z", 
-        "amount": 0.3024
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.784Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.344Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 54, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59054
+    "pk": 60856
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.647Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:48.995Z", 
-        "amount": 0.2408
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:21.892Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.352Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59055
+    "pk": 60857
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.689Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.003Z", 
-        "amount": 0.3024
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.361Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 55, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59056
+    "pk": 60858
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.730Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.012Z", 
-        "amount": 0.224
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.107Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.369Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 55, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59057
+    "pk": 60859
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.771Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.020Z", 
-        "amount": 0.2408
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.215Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.377Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59058
+    "pk": 60860
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.813Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.028Z", 
-        "amount": 0.196, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.331Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.386Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59059
+    "pk": 60861
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.854Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.036Z", 
-        "amount": 0.2968
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.439Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.394Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 55, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59060
+    "pk": 60862
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.896Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.045Z", 
-        "amount": 0.2464
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.559Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.402Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 55, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59061
+    "pk": 60863
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.937Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.053Z", 
-        "amount": 0.252
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.696Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.410Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 55, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59062
+    "pk": 60864
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.979Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.061Z", 
-        "amount": 0.336, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.803Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.419Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 55, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59063
+    "pk": 60865
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.020Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.070Z", 
-        "amount": 0.28
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:22.911Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.427Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 55, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59064
+    "pk": 60866
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.061Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.078Z", 
-        "amount": 0.3192
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.019Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.435Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 55, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59065
+    "pk": 60867
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.103Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.086Z", 
-        "amount": 0.1904
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.126Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.444Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 55, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59066
+    "pk": 60868
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.144Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.094Z", 
-        "amount": 0.2016, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.234Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.452Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 55, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59067
+    "pk": 60869
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.186Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.103Z", 
-        "amount": 0.1232
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.342Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.460Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 55, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59068
+    "pk": 60870
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.227Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.111Z", 
-        "amount": 0.1176, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.449Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.468Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 55, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59069
+    "pk": 60871
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.268Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.119Z", 
-        "amount": 0.308
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.557Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.477Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 55, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59070
+    "pk": 60872
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.310Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.127Z", 
-        "amount": 0.2856, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.665Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.485Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 55, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59071
+    "pk": 60873
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.351Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.136Z", 
-        "amount": 0.3248
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.773Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.493Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 55, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59072
+    "pk": 60874
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.393Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.144Z", 
-        "amount": 0.2016, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.880Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.502Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 55, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59073
+    "pk": 60875
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.434Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.152Z", 
-        "amount": 0.28
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:23.988Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.510Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 55, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59074
+    "pk": 60876
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.476Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.161Z", 
-        "amount": 0.252
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.096Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.518Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 55, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59075
+    "pk": 60877
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.525Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.169Z", 
-        "amount": 0.2352
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.203Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.526Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 56, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59076
+    "pk": 60878
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.567Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.177Z", 
-        "amount": 0.1848
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.311Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.535Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 56, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59077
+    "pk": 60879
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.608Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.186Z", 
-        "amount": 0.2632
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.419Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.543Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 56, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59078
+    "pk": 60880
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.650Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.194Z", 
-        "amount": 0.1232
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.526Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.551Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 56, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59079
+    "pk": 60881
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.693Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.202Z", 
-        "amount": 0.112
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.642Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.560Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59080
+    "pk": 60882
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.734Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.210Z", 
-        "amount": 0.3304
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.750Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.568Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 56, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59081
+    "pk": 60883
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.775Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.219Z", 
-        "amount": 0.2016, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.858Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.576Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 56, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59082
+    "pk": 60884
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.817Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.227Z", 
-        "amount": 0.112
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:24.965Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.584Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59083
+    "pk": 60885
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.858Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.235Z", 
-        "amount": 0.196, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.073Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.593Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 56, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59084
+    "pk": 60886
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.900Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.243Z", 
-        "amount": 0.308
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.181Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.601Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 56, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59085
+    "pk": 60887
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.941Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.252Z", 
-        "amount": 0.1848
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.289Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.609Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 56, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59086
+    "pk": 60888
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.983Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.260Z", 
-        "amount": 0.2016, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.396Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.618Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 56, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59087
+    "pk": 60889
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.024Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.268Z", 
-        "amount": 0.2128
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.504Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.626Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 56, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59088
+    "pk": 60890
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.065Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.277Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.612Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.634Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 56, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59089
+    "pk": 60891
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.107Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.285Z", 
-        "amount": 0.2408
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.719Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.643Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 56, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59090
+    "pk": 60892
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.140Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.293Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.827Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.651Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 56, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59091
+    "pk": 60893
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.181Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.302Z", 
-        "amount": 0.2632
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:25.935Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.659Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 56, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59092
+    "pk": 60894
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.223Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.310Z", 
-        "amount": 0.2352
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.042Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.668Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 56, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59093
+    "pk": 60895
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.264Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.318Z", 
-        "amount": 0.3024
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.150Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.676Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 56, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59094
+    "pk": 60896
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.306Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.326Z", 
-        "amount": 0.2688
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.258Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.684Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 56, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59095
+    "pk": 60897
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.347Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.335Z", 
-        "amount": 0.2744
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.365Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.692Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 56, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59096
+    "pk": 60898
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.397Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.343Z", 
-        "amount": 0.1904
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.473Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.701Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 57, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59097
+    "pk": 60899
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.438Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.351Z", 
-        "amount": 0.112
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.581Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.709Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 57, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59098
+    "pk": 60900
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.479Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.360Z", 
-        "amount": 0.2576, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.689Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.717Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 57, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59099
+    "pk": 60901
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.521Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.368Z", 
-        "amount": 0.1344
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.796Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.725Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 57, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59100
+    "pk": 60902
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.562Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.376Z", 
-        "amount": 0.1568
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:26.912Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.734Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 57, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59101
+    "pk": 60903
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.604Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.384Z", 
-        "amount": 0.196, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.020Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.742Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 57, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59102
+    "pk": 60904
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.645Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.393Z", 
-        "amount": 0.28
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.127Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.750Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 57, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59103
+    "pk": 60905
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.687Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.401Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.235Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.759Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 57, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59104
+    "pk": 60906
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.728Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.409Z", 
-        "amount": 0.3136, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.343Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.767Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 57, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59105
+    "pk": 60907
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.769Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.417Z", 
-        "amount": 0.1456, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.451Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.775Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 57, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59106
+    "pk": 60908
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.811Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.426Z", 
-        "amount": 0.1736, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.558Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.783Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 57, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59107
+    "pk": 60909
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.852Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.434Z", 
-        "amount": 0.1176, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.724Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.792Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 57, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59108
+    "pk": 60910
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.894Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.442Z", 
-        "amount": 0.28
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.832Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.800Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 57, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59109
+    "pk": 60911
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.935Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.451Z", 
-        "amount": 0.3192
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:27.939Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.808Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 57, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59110
+    "pk": 60912
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.977Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.459Z", 
-        "amount": 0.3248
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.047Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.816Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 57, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59111
+    "pk": 60913
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.018Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.467Z", 
-        "amount": 0.1288
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.155Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.825Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 57, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59112
+    "pk": 60914
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.059Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.475Z", 
-        "amount": 0.308
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.262Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.833Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 57, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59113
+    "pk": 60915
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.101Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.484Z", 
-        "amount": 0.1736, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.370Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.841Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 57, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59114
+    "pk": 60916
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.142Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.492Z", 
-        "amount": 0.112
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.478Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.850Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 57, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59115
+    "pk": 60917
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.184Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.500Z", 
-        "amount": 0.3304
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.585Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.858Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 57, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59116
+    "pk": 60918
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.225Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.509Z", 
-        "amount": 0.2072
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:28.693Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.866Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 57, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59117
+    "pk": 60919
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.517Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.517Z", 
-        "amount": 0.196, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.8, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.801Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.874Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59118
+    "pk": 60920
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.525Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.525Z", 
-        "amount": 0.2408, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.909Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.883Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59119
+    "pk": 60921
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.534Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.533Z", 
-        "amount": 0.1512, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.16, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.016Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.891Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59120
+    "pk": 60922
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.542Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.542Z", 
-        "amount": 0.2576, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.68, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.124Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.899Z", 
+        "amount": 0.56, 
+        "object": 114, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59121
+    "pk": 60923
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.550Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.550Z", 
-        "amount": 0.2912
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.908Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.908Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.16
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59122
+    "pk": 60924
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.558Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.558Z", 
-        "amount": 0.2856, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.916Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.916Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.08
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59123
+    "pk": 60925
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.567Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.567Z", 
-        "amount": 0.3136, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.924Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.924Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.48
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59124
+    "pk": 60926
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.575Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.575Z", 
-        "amount": 0.1288
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.932Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.932Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.84
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59125
+    "pk": 60927
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.583Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.583Z", 
-        "amount": 0.2296, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.941Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.941Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.28
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59126
+    "pk": 60928
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.592Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.591Z", 
-        "amount": 0.1512
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.949Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.949Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.16
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59127
+    "pk": 60929
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.600Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.600Z", 
-        "amount": 0.2296, 
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.957Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.957Z", 
+        "amount": 0.56, 
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.28
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59128
+    "pk": 60930
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.608Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.608Z", 
-        "amount": 0.252
-        "object": 96
-        "account": 12
+        "updated": "2013-12-18T21:29:10.966Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.966Z", 
+        "amount": 0.56
+        "object": 114
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.6
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59129
+    "pk": 60931
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.616Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.616Z", 
-        "amount": 0.2016, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.88, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.285Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.981Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59130
+    "pk": 60932
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:49.625Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:49.624Z", 
-        "amount": 0.252, 
-        "object": 96, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.6, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.393Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:10.990Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59131
+    "pk": 60933
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.067Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.640Z", 
-        "amount": 0.3192
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:20.500Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:10.999Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 54, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59132
+    "pk": 60934
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.109Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.649Z", 
-        "amount": 0.112
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:20.608Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.007Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 54, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59133
+    "pk": 60935
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.150Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.658Z", 
-        "amount": 0.3136, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:20.716Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.015Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 54, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59134
+    "pk": 60936
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.192Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.666Z", 
-        "amount": 0.2576, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:20.823Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.024Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 54, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59135
+    "pk": 60937
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.233Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.674Z", 
-        "amount": 0.112
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:20.931Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.032Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 54, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59136
+    "pk": 60938
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.274Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.683Z", 
-        "amount": 0.1848
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.039Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.040Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 54, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59137
+    "pk": 60939
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.316Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.691Z", 
-        "amount": 0.2912
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.147Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.048Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 54, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59138
+    "pk": 60940
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.357Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.699Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.254Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.057Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 54, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59139
+    "pk": 60941
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.399Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.707Z", 
-        "amount": 0.2968
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.362Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.065Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 54, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59140
+    "pk": 60942
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.440Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.716Z", 
-        "amount": 0.1288
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.470Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.073Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 54, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59141
+    "pk": 60943
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.481Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.724Z", 
-        "amount": 0.2128
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.577Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.081Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 54, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59142
+    "pk": 60944
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.523Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.732Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.685Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.090Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 54, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59143
+    "pk": 60945
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.564Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.740Z", 
-        "amount": 0.1792
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.793Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.098Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 54, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59144
+    "pk": 60946
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.639Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.749Z", 
-        "amount": 0.1904
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:21.900Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.106Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 55, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59145
+    "pk": 60947
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.680Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.757Z", 
-        "amount": 0.2408
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.008Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.115Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59146
+    "pk": 60948
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.722Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.765Z", 
-        "amount": 0.2408
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.116Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.123Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59147
+    "pk": 60949
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.763Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.774Z", 
-        "amount": 0.196, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.223Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.131Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59148
+    "pk": 60950
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.805Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.782Z", 
-        "amount": 0.14
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.339Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.140Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 55, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59149
+    "pk": 60951
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.846Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.790Z", 
-        "amount": 0.308
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.447Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.148Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 55, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59150
+    "pk": 60952
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.887Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.799Z", 
-        "amount": 0.2352
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.596Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.156Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59151
+    "pk": 60953
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.929Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.807Z", 
-        "amount": 0.1456, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.704Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.164Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 55, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59152
+    "pk": 60954
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.970Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.815Z", 
-        "amount": 0.1568
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.812Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.173Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 55, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59153
+    "pk": 60955
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.012Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.823Z", 
-        "amount": 0.2968
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:22.919Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.181Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 55, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59154
+    "pk": 60956
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.053Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.832Z", 
-        "amount": 0.2856, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.027Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.189Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 55, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59155
+    "pk": 60957
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.095Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.840Z", 
-        "amount": 0.2408
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.135Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.197Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59156
+    "pk": 60958
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.136Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.848Z", 
-        "amount": 0.1344
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.242Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.206Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 55, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59157
+    "pk": 60959
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.177Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.857Z", 
-        "amount": 0.1736, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.350Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.214Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 55, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59158
+    "pk": 60960
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.219Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.865Z", 
-        "amount": 0.3304
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.458Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.222Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 55, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59159
+    "pk": 60961
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.260Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.873Z", 
-        "amount": 0.308
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.565Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.231Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 55, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59160
+    "pk": 60962
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.302Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.881Z", 
-        "amount": 0.2856, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.673Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.239Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 55, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59161
+    "pk": 60963
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.343Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.890Z", 
-        "amount": 0.3248
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.781Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.247Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 55, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59162
+    "pk": 60964
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.385Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.898Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.889Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.255Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 55, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59163
+    "pk": 60965
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.426Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.906Z", 
-        "amount": 0.2968
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:23.996Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.264Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 55, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59164
+    "pk": 60966
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.467Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.915Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.104Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.272Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 55, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59165
+    "pk": 60967
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.517Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.923Z", 
-        "amount": 0.14
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.212Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.280Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 56, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59166
+    "pk": 60968
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.558Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.931Z", 
-        "amount": 0.2744
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.319Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.289Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 56, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59167
+    "pk": 60969
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.600Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.939Z", 
-        "amount": 0.2352
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.427Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.297Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 56, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59168
+    "pk": 60970
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.641Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.948Z", 
-        "amount": 0.28
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.535Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.305Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 56, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59169
+    "pk": 60971
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.684Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.956Z", 
-        "amount": 0.28
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.651Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.313Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 56, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59170
+    "pk": 60972
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.726Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.964Z", 
-        "amount": 0.336, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.758Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.322Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 56, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59171
+    "pk": 60973
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.767Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.973Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.866Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.330Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 56, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59172
+    "pk": 60974
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.809Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.981Z", 
-        "amount": 0.252
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:24.974Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.338Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 56, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59173
+    "pk": 60975
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.850Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.989Z", 
-        "amount": 0.2688
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.081Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.346Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 56, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59174
+    "pk": 60976
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.891Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:49.997Z", 
-        "amount": 0.2632
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.189Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.355Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 56, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59175
+    "pk": 60977
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.933Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.006Z", 
-        "amount": 0.2912
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.297Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.363Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 56, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59176
+    "pk": 60978
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.974Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.014Z", 
-        "amount": 0.1176, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.404Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.371Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 56, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59177
+    "pk": 60979
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.016Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.022Z", 
-        "amount": 0.168
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.512Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.380Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 56, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59178
+    "pk": 60980
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.057Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.030Z", 
-        "amount": 0.112
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.620Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.388Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59179
+    "pk": 60981
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.098Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.039Z", 
-        "amount": 0.1848
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.728Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.396Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 56, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59180
+    "pk": 60982
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.132Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.047Z", 
-        "amount": 0.2128
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.835Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.404Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 56, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59181
+    "pk": 60983
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.173Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.055Z", 
-        "amount": 0.1624
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:25.943Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.413Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 56, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59182
+    "pk": 60984
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.214Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.064Z", 
-        "amount": 0.3248
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.051Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.421Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 56, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59183
+    "pk": 60985
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.256Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.072Z", 
-        "amount": 0.1512
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.158Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.429Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 56, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59184
+    "pk": 60986
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.297Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.080Z", 
-        "amount": 0.1176, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.266Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.438Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 56, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59185
+    "pk": 60987
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.339Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.088Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.374Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.446Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 56, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59186
+    "pk": 60988
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.388Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.097Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.481Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.454Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59187
+    "pk": 60989
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.430Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.105Z", 
-        "amount": 0.1288
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.589Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.463Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 57, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59188
+    "pk": 60990
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.471Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.113Z", 
-        "amount": 0.168
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.697Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.471Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 57, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59189
+    "pk": 60991
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.513Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.122Z", 
-        "amount": 0.2856, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.804Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.479Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 57, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59190
+    "pk": 60992
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.554Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.130Z", 
-        "amount": 0.2744
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:26.920Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.487Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59191
+    "pk": 60993
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.596Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.138Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.028Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.496Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 57, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59192
+    "pk": 60994
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.637Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.146Z", 
-        "amount": 0.2072
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.136Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.504Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 57, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59193
+    "pk": 60995
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.678Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.155Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.244Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.512Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59194
+    "pk": 60996
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.720Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.163Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.351Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.521Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59195
+    "pk": 60997
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.761Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.171Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.459Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.529Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 57, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59196
+    "pk": 60998
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.803Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.180Z", 
-        "amount": 0.2576, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.584Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.537Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 57, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59197
+    "pk": 60999
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.844Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.188Z", 
-        "amount": 0.2296, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.732Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.545Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 57, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59198
+    "pk": 61000
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.885Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.196Z", 
-        "amount": 0.1344
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.840Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.554Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 57, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59199
+    "pk": 61001
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.927Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.204Z", 
-        "amount": 0.3304
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:27.948Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.562Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 57, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59200
+    "pk": 61002
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.968Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.213Z", 
-        "amount": 0.1232
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.055Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.570Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 57, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59201
+    "pk": 61003
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.010Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.221Z", 
-        "amount": 0.224
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.163Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.579Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 57, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59202
+    "pk": 61004
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.051Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.229Z", 
-        "amount": 0.2352
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.271Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.587Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 57, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59203
+    "pk": 61005
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.093Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.238Z", 
-        "amount": 0.2464
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.378Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.595Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59204
+    "pk": 61006
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.134Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.246Z", 
-        "amount": 0.2912
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.486Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.603Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 57, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59205
+    "pk": 61007
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.175Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.254Z", 
-        "amount": 0.2408
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.594Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.612Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 57, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59206
+    "pk": 61008
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.217Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.262Z", 
-        "amount": 0.1288
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:28.702Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.620Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 57, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59207
+    "pk": 61009
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.271Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.271Z", 
-        "amount": 0.2408, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.809Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.628Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59208
+    "pk": 61010
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.279Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.279Z", 
-        "amount": 0.1568, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.24, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.917Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.637Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59209
+    "pk": 61011
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.287Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.287Z", 
-        "amount": 0.1512, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.16, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.024Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.645Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59210
+    "pk": 61012
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.296Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.296Z", 
-        "amount": 0.3304, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.72, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.132Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.653Z", 
+        "amount": 0.56, 
+        "object": 115, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59211
+    "pk": 61013
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.304Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.304Z", 
-        "amount": 0.1848
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.662Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.662Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.64
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59212
+    "pk": 61014
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.312Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.312Z", 
-        "amount": 0.1232
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.670Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.670Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.76
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59213
+    "pk": 61015
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.321Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.321Z", 
-        "amount": 0.2744
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.678Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.678Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.92
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59214
+    "pk": 61016
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.329Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.329Z", 
-        "amount": 0.1624
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.686Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.686Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.32
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59215
+    "pk": 61017
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.337Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.337Z", 
-        "amount": 0.196, 
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.695Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.695Z", 
+        "amount": 0.56, 
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.8
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59216
+    "pk": 61018
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.345Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.345Z", 
-        "amount": 0.2688
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.703Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.703Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.84
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59217
+    "pk": 61019
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.354Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.354Z", 
-        "amount": 0.14
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.711Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.711Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.0, 
+        "coreHours": 8.0, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59218
+    "pk": 61020
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.362Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.362Z", 
-        "amount": 0.1848
-        "object": 97
-        "account": 12
+        "updated": "2013-12-18T21:29:11.719Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.719Z", 
+        "amount": 0.56
+        "object": 115
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.64
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59219
+    "pk": 61021
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.370Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.370Z", 
-        "amount": 0.2408, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.293Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.734Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59220
+    "pk": 61022
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:50.379Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:50.379Z", 
-        "amount": 0.2632, 
-        "object": 97, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.76, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:20.401Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:11.744Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59221
+    "pk": 61023
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.059Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.393Z", 
-        "amount": 0.1344
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:20.509Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.753Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 54, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59222
+    "pk": 61024
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.100Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.403Z", 
-        "amount": 0.2408
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:20.616Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.761Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 54, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59223
+    "pk": 61025
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.142Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.412Z", 
-        "amount": 0.28
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:20.724Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.769Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 54, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59224
+    "pk": 61026
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.183Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.420Z", 
-        "amount": 0.3248
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:20.832Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.777Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 54, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59225
+    "pk": 61027
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.225Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.428Z", 
-        "amount": 0.2464
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:20.939Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.786Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 54, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59226
+    "pk": 61028
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.266Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.436Z", 
-        "amount": 0.224
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.047Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.794Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 54, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59227
+    "pk": 61029
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.307Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.445Z", 
-        "amount": 0.2912
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.155Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.802Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 54, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59228
+    "pk": 61030
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.349Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.453Z", 
-        "amount": 0.2912
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.262Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.810Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 54, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59229
+    "pk": 61031
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.390Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.464Z", 
-        "amount": 0.2016, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.370Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.819Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 54, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59230
+    "pk": 61032
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.432Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.470Z", 
-        "amount": 0.196, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.478Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.827Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 54, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59231
+    "pk": 61033
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.473Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.478Z", 
-        "amount": 0.2128
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.586Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.835Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 54, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59232
+    "pk": 61034
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.515Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.486Z", 
-        "amount": 0.3304
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.693Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.844Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 54, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59233
+    "pk": 61035
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.556Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.494Z", 
-        "amount": 0.3304
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.801Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.852Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 54, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59234
+    "pk": 61036
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.631Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.503Z", 
-        "amount": 0.252
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:21.909Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.860Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 55, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59235
+    "pk": 61037
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.672Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.511Z", 
-        "amount": 0.308
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.016Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.868Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 55, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59236
+    "pk": 61038
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.713Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.519Z", 
-        "amount": 0.3136, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.124Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.877Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 55, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59237
+    "pk": 61039
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.755Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.528Z", 
-        "amount": 0.2464
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.232Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.885Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 55, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 69, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59238
+    "pk": 61040
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.796Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.536Z", 
-        "amount": 0.2352
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.348Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.893Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59239
+    "pk": 61041
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.838Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.559Z", 
-        "amount": 0.2072
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.455Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.902Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 55, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59240
+    "pk": 61042
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.879Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.577Z", 
-        "amount": 0.252
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.604Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.910Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 55, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59241
+    "pk": 61043
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.921Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.586Z", 
-        "amount": 0.1904
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.712Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.918Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 55, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59242
+    "pk": 61044
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.962Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.594Z", 
-        "amount": 0.3024
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.820Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.927Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 55, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59243
+    "pk": 61045
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.003Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.602Z", 
-        "amount": 0.1176, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:22.928Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.935Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 55, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59244
+    "pk": 61046
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.045Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.610Z", 
-        "amount": 0.2296, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.035Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.943Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 55, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59245
+    "pk": 61047
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.086Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.619Z", 
-        "amount": 0.2688
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.143Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.951Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 55, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59246
+    "pk": 61048
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.128Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.627Z", 
-        "amount": 0.308
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.251Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.960Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 55, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59247
+    "pk": 61049
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.169Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.635Z", 
-        "amount": 0.196, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.358Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.968Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59248
+    "pk": 61050
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.210Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.643Z", 
-        "amount": 0.2296, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.466Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.976Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 55, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59249
+    "pk": 61051
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.252Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.652Z", 
-        "amount": 0.3192
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.574Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.984Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 55, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59250
+    "pk": 61052
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.293Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.660Z", 
-        "amount": 0.2352
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.681Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:11.993Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59251
+    "pk": 61053
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.335Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.668Z", 
-        "amount": 0.168
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.789Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.001Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 55, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59252
+    "pk": 61054
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.376Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.677Z", 
-        "amount": 0.3024
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:23.897Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.009Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 55, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59253
+    "pk": 61055
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.418Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.685Z", 
-        "amount": 0.2352
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.004Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.018Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59254
+    "pk": 61056
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.459Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.693Z", 
-        "amount": 0.1568
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.112Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.026Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 55, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59255
+    "pk": 61057
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.509Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.702Z", 
-        "amount": 0.3304
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.220Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.034Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 56, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59256
+    "pk": 61058
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.550Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.710Z", 
-        "amount": 0.1736, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.328Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.042Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 56, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59257
+    "pk": 61059
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.592Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.718Z", 
-        "amount": 0.168
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.435Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.051Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.4, 
-        "invoice": 56, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59258
+    "pk": 61060
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.633Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.726Z", 
-        "amount": 0.14
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.543Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.059Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 56, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 70, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59259
+    "pk": 61061
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.676Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.735Z", 
-        "amount": 0.1176, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.659Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.067Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 56, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59260
+    "pk": 61062
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.717Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.743Z", 
-        "amount": 0.2688
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.767Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.076Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 56, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59261
+    "pk": 61063
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.759Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.751Z", 
-        "amount": 0.308
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.874Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.084Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 56, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59262
+    "pk": 61064
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.800Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.759Z", 
-        "amount": 0.196, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:24.982Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.092Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 56, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59263
+    "pk": 61065
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.842Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.768Z", 
-        "amount": 0.196, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.090Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.100Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 56, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59264
+    "pk": 61066
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.883Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.776Z", 
-        "amount": 0.2464
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.197Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.109Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 56, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59265
+    "pk": 61067
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.925Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.784Z", 
-        "amount": 0.2968
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.305Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.117Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 56, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59266
+    "pk": 61068
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.966Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.793Z", 
-        "amount": 0.1792
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.413Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.125Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 56, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59267
+    "pk": 61069
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.007Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.801Z", 
-        "amount": 0.3248
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.520Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.134Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 56, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59268
+    "pk": 61070
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.049Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.809Z", 
-        "amount": 0.3192
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.628Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.142Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 56, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59269
+    "pk": 61071
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.090Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.818Z", 
-        "amount": 0.1568
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.736Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.150Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 56, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59270
+    "pk": 61072
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.123Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.826Z", 
-        "amount": 0.2856, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.844Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.159Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 56, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59271
+    "pk": 61073
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.165Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.834Z", 
-        "amount": 0.3136, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:25.951Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.167Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 56, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59272
+    "pk": 61074
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.206Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.843Z", 
-        "amount": 0.1904
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.059Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.175Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 56, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59273
+    "pk": 61075
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.248Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.851Z", 
-        "amount": 0.1624
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.167Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.183Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 56, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59274
+    "pk": 61076
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.289Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.859Z", 
-        "amount": 0.224
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.274Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.192Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 56, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59275
+    "pk": 61077
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.331Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.867Z", 
-        "amount": 0.14
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.382Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.200Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 56, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59276
+    "pk": 61078
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.380Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.876Z", 
-        "amount": 0.1456, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.490Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.208Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 57, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59277
+    "pk": 61079
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.422Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.884Z", 
-        "amount": 0.1736, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.597Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.217Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 57, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59278
+    "pk": 61080
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.463Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.892Z", 
-        "amount": 0.2912
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.705Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.225Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 57, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59279
+    "pk": 61081
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.504Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.901Z", 
-        "amount": 0.3192
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.813Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.233Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 57, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 71, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59280
+    "pk": 61082
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.546Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.909Z", 
-        "amount": 0.1792
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:26.929Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.242Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 57, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59281
+    "pk": 61083
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.587Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.917Z", 
-        "amount": 0.1792
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.036Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.250Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 57, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59282
+    "pk": 61084
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.629Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.925Z", 
-        "amount": 0.2184
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.144Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.258Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 57, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59283
+    "pk": 61085
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.670Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.934Z", 
-        "amount": 0.3024
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.252Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.266Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 57, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59284
+    "pk": 61086
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.711Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.942Z", 
-        "amount": 0.112
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.359Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.275Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 57, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59285
+    "pk": 61087
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.753Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.950Z", 
-        "amount": 0.14
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.467Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.283Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 57, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59286
+    "pk": 61088
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.794Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.958Z", 
-        "amount": 0.2464
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.628Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.291Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59287
+    "pk": 61089
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.836Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.967Z", 
-        "amount": 0.1344
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.741Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.299Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 57, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59288
+    "pk": 61090
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.877Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.975Z", 
-        "amount": 0.112
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.848Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.308Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 57, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59289
+    "pk": 61091
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.919Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.983Z", 
-        "amount": 0.2128
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:27.956Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.316Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 57, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59290
+    "pk": 61092
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.960Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:50.991Z", 
-        "amount": 0.2744
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.064Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.324Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59291
+    "pk": 61093
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.001Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.000Z", 
-        "amount": 0.2632
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.171Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.333Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 57, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59292
+    "pk": 61094
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.043Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.008Z", 
-        "amount": 0.3136, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.279Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.341Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.48, 
-        "invoice": 57, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59293
+    "pk": 61095
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.084Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.016Z", 
-        "amount": 0.1232
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.387Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.349Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 57, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59294
+    "pk": 61096
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.126Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.025Z", 
-        "amount": 0.2744
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.494Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.357Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59295
+    "pk": 61097
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.167Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.033Z", 
-        "amount": 0.2744
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.602Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.366Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59296
+    "pk": 61098
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.209Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.041Z", 
-        "amount": 0.3192
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:28.710Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.374Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 57, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59297
+    "pk": 61099
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.049Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:51.049Z", 
-        "amount": 0.28, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.817Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:12.382Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59298
+    "pk": 61100
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.058Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:51.058Z", 
-        "amount": 0.1232, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 1.76, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:28.925Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:12.391Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59299
+    "pk": 61101
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.066Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:51.066Z", 
-        "amount": 0.1904, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.72, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.033Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:12.399Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59300
+    "pk": 61102
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.074Z", 
-        "slice": 14, 
-        "created": "2013-12-13T22:19:51.074Z", 
-        "amount": 0.2408, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.44, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "updated": "2013-12-18T21:29:29.141Z", 
+        "slice": 13, 
+        "created": "2013-12-18T21:29:12.407Z", 
+        "amount": 0.56, 
+        "object": 116, 
+        "account": 15, 
+        "state": "invoiced", 
+        "coreHours": 8.0, 
+        "invoice": 72, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59301
+    "pk": 61103
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.083Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.083Z", 
-        "amount": 0.2352
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.415Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.415Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.36
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59302
+    "pk": 61104
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.091Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.091Z", 
-        "amount": 0.2968
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.424Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.424Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 4.24
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59303
+    "pk": 61105
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.099Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.099Z", 
-        "amount": 0.2576, 
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.432Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.432Z", 
+        "amount": 0.56, 
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.68
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59304
+    "pk": 61106
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.107Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.107Z", 
-        "amount": 0.2184
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.440Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.440Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.12
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59305
+    "pk": 61107
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.116Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.116Z", 
-        "amount": 0.1848
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.449Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.448Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 2.64
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59306
+    "pk": 61108
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.124Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.124Z", 
-        "amount": 0.2464
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.457Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.457Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.52
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59307
+    "pk": 61109
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.132Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.132Z", 
-        "amount": 0.112
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.465Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.465Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 1.6
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59308
+    "pk": 61110
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.141Z", 
-        "slice": 14
-        "created": "2013-12-13T22:19:51.141Z", 
-        "amount": 0.2632
-        "object": 98
-        "account": 12
+        "updated": "2013-12-18T21:29:12.473Z", 
+        "slice": 13
+        "created": "2013-12-18T21:29:12.473Z", 
+        "amount": 0.56
+        "object": 116
+        "account": 15
         "state": "pending", 
-        "coreHours": 3.76
+        "coreHours": 8.0
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
-    "pk": 59309
+    "pk": 61111
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.149Z", 
+        "updated": "2013-12-18T21:29:16.468Z", 
         "slice": 14, 
-        "created": "2013-12-13T22:19:51.149Z", 
-        "amount": 0.3248, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.64, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:12.505Z", 
+        "amount": 0.2856, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 64, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59310
+    "pk": 61112
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.157Z", 
+        "updated": "2013-12-18T21:29:16.510Z", 
         "slice": 14, 
-        "created": "2013-12-13T22:19:51.157Z", 
-        "amount": 0.1288, 
-        "object": 98, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 1.84, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:12.565Z", 
+        "amount": 0.3136, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59311
+    "pk": 61113
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.432Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.189Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.551Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.573Z", 
+        "amount": 0.308
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.4, 
+        "invoice": 64, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59312
+    "pk": 61114
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.523Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.199Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.593Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.581Z", 
+        "amount": 0.2072
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59313
+    "pk": 61115
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.614Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.207Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.634Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.589Z", 
+        "amount": 0.2072
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59314
+    "pk": 61116
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.706Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.215Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.675Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.598Z", 
+        "amount": 0.252
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.6, 
+        "invoice": 64, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59315
+    "pk": 61117
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.797Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.223Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.717Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.606Z", 
+        "amount": 0.2688
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 64, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59316
+    "pk": 61118
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.888Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.232Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.758Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.614Z", 
+        "amount": 0.3136, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59317
+    "pk": 61119
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.996Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.240Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.800Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.622Z", 
+        "amount": 0.3248
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.64, 
+        "invoice": 64, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59318
+    "pk": 61120
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.087Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.248Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.841Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.631Z", 
+        "amount": 0.2072
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59319
+    "pk": 61121
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.178Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.257Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.883Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.639Z", 
+        "amount": 0.2576, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 64, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59320
+    "pk": 61122
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.270Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.265Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.924Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.647Z", 
+        "amount": 0.14
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59321
+    "pk": 61123
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.352Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.273Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:16.966Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.656Z", 
+        "amount": 0.1512
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 64, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59322
+    "pk": 61124
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.444Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.281Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.007Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.664Z", 
+        "amount": 0.28
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 64, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59323
+    "pk": 61125
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.535Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.290Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.048Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.672Z", 
+        "amount": 0.2408
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.44, 
+        "invoice": 64, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59324
+    "pk": 61126
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.634Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.298Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.090Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.680Z", 
+        "amount": 0.308
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.4, 
+        "invoice": 64, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59325
+    "pk": 61127
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.737Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.306Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.131Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.689Z", 
+        "amount": 0.2856, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 64, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59326
+    "pk": 61128
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.828Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.315Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.173Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.697Z", 
+        "amount": 0.1232
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.76, 
+        "invoice": 64, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59327
+    "pk": 61129
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.919Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.323Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.220Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.705Z", 
+        "amount": 0.1848
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.64, 
+        "invoice": 64, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59328
+    "pk": 61130
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.010Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.331Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.289Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.714Z", 
+        "amount": 0.2016, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 65, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59329
+    "pk": 61131
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.101Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.340Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.344Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.722Z", 
+        "amount": 0.2296, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 65, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59330
+    "pk": 61132
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.192Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.348Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.385Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.730Z", 
+        "amount": 0.2968
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 65, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59331
+    "pk": 61133
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.284Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.356Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.427Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.739Z", 
+        "amount": 0.1736, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 65, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59332
+    "pk": 61134
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.377Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.364Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.468Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.747Z", 
+        "amount": 0.336, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59333
+    "pk": 61135
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.468Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.373Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.510Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.755Z", 
+        "amount": 0.308
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.4, 
+        "invoice": 65, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59334
+    "pk": 61136
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.560Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.381Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.626Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.763Z", 
+        "amount": 0.2744
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.92, 
+        "invoice": 65, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59335
+    "pk": 61137
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.667Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.389Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.667Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.772Z", 
+        "amount": 0.2016, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 65, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59336
+    "pk": 61138
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.758Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.398Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.709Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.780Z", 
+        "amount": 0.1512
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 65, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59337
+    "pk": 61139
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.850Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.406Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.750Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.788Z", 
+        "amount": 0.2912
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 65, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59338
+    "pk": 61140
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.965Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.414Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.791Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.797Z", 
+        "amount": 0.3248
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.64, 
+        "invoice": 65, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59339
+    "pk": 61141
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.057Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.422Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.833Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.805Z", 
+        "amount": 0.3192
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.56, 
+        "invoice": 65, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59340
+    "pk": 61142
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.148Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.431Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.874Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.813Z", 
+        "amount": 0.1736, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 65, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59341
+    "pk": 61143
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.273Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.439Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.916Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.821Z", 
+        "amount": 0.2632
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 65, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59342
+    "pk": 61144
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.537Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.447Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.957Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.830Z", 
+        "amount": 0.2464
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 65, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59343
+    "pk": 61145
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.777Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.455Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:17.999Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.838Z", 
+        "amount": 0.3192
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.56, 
+        "invoice": 65, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59344
+    "pk": 61146
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.868Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.464Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.040Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.846Z", 
+        "amount": 0.28
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 65, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59345
+    "pk": 61147
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.968Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.472Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.081Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.854Z", 
+        "amount": 0.1288
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.84, 
+        "invoice": 65, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59346
+    "pk": 61148
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.059Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.480Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.123Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.863Z", 
+        "amount": 0.1568
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.24, 
+        "invoice": 65, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59347
+    "pk": 61149
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.150Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.489Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.164Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.871Z", 
+        "amount": 0.1904
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.72, 
+        "invoice": 65, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59348
+    "pk": 61150
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.246Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.497Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.206Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.879Z", 
+        "amount": 0.3136, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59349
+    "pk": 61151
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.337Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.505Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.255Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.888Z", 
+        "amount": 0.1456, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.08, 
+        "invoice": 66, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59350
+    "pk": 61152
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.428Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.513Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.297Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.896Z", 
+        "amount": 0.2464
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 66, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59351
+    "pk": 61153
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.519Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.522Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.338Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.904Z", 
+        "amount": 0.2464
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 66, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59352
+    "pk": 61154
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.610Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.530Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.379Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.913Z", 
+        "amount": 0.2016, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 66, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59353
+    "pk": 61155
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.701Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.538Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.421Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.921Z", 
+        "amount": 0.1736, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 66, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59354
+    "pk": 61156
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.793Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.546Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.462Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.929Z", 
+        "amount": 0.2408
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.44, 
+        "invoice": 66, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59355
+    "pk": 61157
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.884Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.555Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.504Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.937Z", 
+        "amount": 0.2912
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 66, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59356
+    "pk": 61158
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.975Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.563Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.545Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.946Z", 
+        "amount": 0.1288
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.84, 
+        "invoice": 66, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59357
+    "pk": 61159
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.066Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.571Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.587Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.954Z", 
+        "amount": 0.2632
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 66, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59358
+    "pk": 61160
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.157Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.580Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.628Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.962Z", 
+        "amount": 0.3024
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 66, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59359
+    "pk": 61161
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.248Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.588Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.670Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.970Z", 
+        "amount": 0.2296, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 66, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59360
+    "pk": 61162
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.339Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.596Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.711Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.979Z", 
+        "amount": 0.3304
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 66, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59361
+    "pk": 61163
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.432Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.604Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.752Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.987Z", 
+        "amount": 0.1176, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 66, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59362
+    "pk": 61164
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.523Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.613Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.794Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:12.995Z", 
+        "amount": 0.28
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 66, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59363
+    "pk": 61165
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.614Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.621Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.835Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.004Z", 
+        "amount": 0.224
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.2, 
+        "invoice": 66, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59364
+    "pk": 61166
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.705Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.629Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.877Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.012Z", 
+        "amount": 0.2688
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 66, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59365
+    "pk": 61167
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.797Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.638Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.918Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.020Z", 
+        "amount": 0.1568
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.24, 
+        "invoice": 66, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59366
+    "pk": 61168
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.896Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.646Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:18.959Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.028Z", 
+        "amount": 0.1624
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 66, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59367
+    "pk": 61169
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.987Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.654Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.001Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.037Z", 
+        "amount": 0.2688
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 66, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59368
+    "pk": 61170
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.078Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.662Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.042Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.045Z", 
+        "amount": 0.2912
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 66, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59369
+    "pk": 61171
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.169Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.671Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.084Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.053Z", 
+        "amount": 0.1344
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 66, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59370
+    "pk": 61172
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.260Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.679Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.133Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.062Z", 
+        "amount": 0.196, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.8, 
+        "invoice": 67, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59371
+    "pk": 61173
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.352Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.687Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.175Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.070Z", 
+        "amount": 0.2184
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59372
+    "pk": 61174
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.443Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.696Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.216Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.078Z", 
+        "amount": 0.3304
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 67, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59373
+    "pk": 61175
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.534Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.704Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.258Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.086Z", 
+        "amount": 0.2184
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59374
+    "pk": 61176
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.625Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.712Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.299Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.095Z", 
+        "amount": 0.1176, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59375
+    "pk": 61177
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.716Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.720Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.341Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.103Z", 
+        "amount": 0.1624
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 67, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59376
+    "pk": 61178
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.807Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.729Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.382Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.111Z", 
+        "amount": 0.2968
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 67, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59377
+    "pk": 61179
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.898Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.737Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.423Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.120Z", 
+        "amount": 0.1344
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 67, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59378
+    "pk": 61180
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.989Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.745Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.465Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.128Z", 
+        "amount": 0.3136, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59379
+    "pk": 61181
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.081Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.754Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.506Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.136Z", 
+        "amount": 0.1344
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 67, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59380
+    "pk": 61182
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.178Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.762Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.548Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.153Z", 
+        "amount": 0.112
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.6, 
+        "invoice": 67, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59381
+    "pk": 61183
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.269Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.770Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.589Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.161Z", 
+        "amount": 0.1176, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59382
+    "pk": 61184
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.361Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.778Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.630Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.170Z", 
+        "amount": 0.1456, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59383
+    "pk": 61185
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.452Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.787Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.672Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.178Z", 
+        "amount": 0.308
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.4, 
+        "invoice": 67, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59384
+    "pk": 61186
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.543Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.795Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.713Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.186Z", 
+        "amount": 0.28
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 67, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59385
+    "pk": 61187
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.634Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.803Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.755Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.195Z", 
+        "amount": 0.336, 
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 67, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59386
+    "pk": 61188
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.725Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.812Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:19.796Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.203Z", 
+        "amount": 0.1344
+        "object": 117
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 67, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59387
+    "pk": 61189
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.820Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.820Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.804Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.220Z", 
+        "amount": 0.3136, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59388
+    "pk": 61190
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.828Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.828Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.846Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.228Z", 
+        "amount": 0.3024, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.32, 
+        "invoice": 67, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59389
+    "pk": 61191
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.837Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.837Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.887Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.236Z", 
+        "amount": 0.112, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 1.6, 
+        "invoice": 67, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59390
+    "pk": 61192
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.845Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.845Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.929Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.245Z", 
+        "amount": 0.2856, 
+        "object": 117, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.08, 
+        "invoice": 67, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59391
+    "pk": 61193
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.853Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.853Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.253Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.253Z", 
+        "amount": 0.1288
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 1.84
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59392
+    "pk": 61194
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.861Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.861Z", 
-        "amount": 0.56, 
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.261Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.261Z", 
+        "amount": 0.336, 
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 4.8
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59393
+    "pk": 61195
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.870Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.870Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.278Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.278Z", 
+        "amount": 0.1624
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.32
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59394
+    "pk": 61196
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.878Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.878Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.286Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.286Z", 
+        "amount": 0.1904
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.72
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59395
+    "pk": 61197
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.886Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.886Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.294Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.294Z", 
+        "amount": 0.3192
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 4.56
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59396
+    "pk": 61198
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.895Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.895Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.303Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.303Z", 
+        "amount": 0.14
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0, 
+        "coreHours": 2.0, 
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59397
+    "pk": 61199
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.903Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.903Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.311Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.311Z", 
+        "amount": 0.1288
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 1.84
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59398
+    "pk": 61200
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.911Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.911Z", 
-        "amount": 0.56
-        "object": 99
-        "account": 13
+        "updated": "2013-12-18T21:29:13.319Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.319Z", 
+        "amount": 0.2632
+        "object": 117
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.76
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59399
+    "pk": 61201
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.919Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.919Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.427Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.334Z", 
+        "amount": 0.2968, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.24, 
+        "invoice": 63, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59400
+    "pk": 61202
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:51.928Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:51.928Z", 
-        "amount": 0.56, 
-        "object": 99, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.477Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.344Z", 
+        "amount": 0.2072, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59401
+    "pk": 61203
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.424Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.943Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.518Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.352Z", 
+        "amount": 0.2968
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 64, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59402
+    "pk": 61204
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.515Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.952Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.560Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.361Z", 
+        "amount": 0.2296, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 64, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59403
+    "pk": 61205
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.606Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.961Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.601Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.369Z", 
+        "amount": 0.14
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59404
+    "pk": 61206
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.697Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.969Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.642Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.377Z", 
+        "amount": 0.2968
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 64, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59405
+    "pk": 61207
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.788Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.977Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.684Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.385Z", 
+        "amount": 0.1512
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 64, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59406
+    "pk": 61208
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.880Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.986Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.725Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.394Z", 
+        "amount": 0.336, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 64, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59407
+    "pk": 61209
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.988Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:51.994Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.767Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.402Z", 
+        "amount": 0.2688
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 64, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59408
+    "pk": 61210
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.079Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.002Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.808Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.410Z", 
+        "amount": 0.308
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.4, 
+        "invoice": 64, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59409
+    "pk": 61211
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.170Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.010Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.850Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.418Z", 
+        "amount": 0.1792
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.56, 
+        "invoice": 64, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59410
+    "pk": 61212
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.261Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.019Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.891Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.427Z", 
+        "amount": 0.3304
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 64, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59411
+    "pk": 61213
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.344Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.027Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.932Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.435Z", 
+        "amount": 0.1288
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.84, 
+        "invoice": 64, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59412
+    "pk": 61214
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.435Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.035Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:16.974Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.443Z", 
+        "amount": 0.2352
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.36, 
+        "invoice": 64, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59413
+    "pk": 61215
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.526Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.044Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.015Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.452Z", 
+        "amount": 0.3304
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 64, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59414
+    "pk": 61216
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.626Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.052Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.057Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.460Z", 
+        "amount": 0.2912
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 64, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59415
+    "pk": 61217
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.729Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.060Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.098Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.468Z", 
+        "amount": 0.1512
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 64, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59416
+    "pk": 61218
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.820Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.068Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.140Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.476Z", 
+        "amount": 0.112
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.6, 
+        "invoice": 64, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59417
+    "pk": 61219
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.911Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.077Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.181Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.485Z", 
+        "amount": 0.3136, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59418
+    "pk": 61220
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.002Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.085Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.239Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.493Z", 
+        "amount": 0.1512
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 65, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59419
+    "pk": 61221
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.093Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.093Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.303Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.501Z", 
+        "amount": 0.2016, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 65, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59420
+    "pk": 61222
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.184Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.102Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.352Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.510Z", 
+        "amount": 0.2968
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 65, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59421
+    "pk": 61223
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.275Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.110Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.394Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.518Z", 
+        "amount": 0.1736, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 65, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59422
+    "pk": 61224
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.367Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.118Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.435Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.526Z", 
+        "amount": 0.3304
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 65, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59423
+    "pk": 61225
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.460Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.126Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.477Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.534Z", 
+        "amount": 0.3248
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.64, 
+        "invoice": 65, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59424
+    "pk": 61226
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.551Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.135Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.531Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.543Z", 
+        "amount": 0.1344
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 65, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59425
+    "pk": 61227
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.659Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.143Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.634Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.551Z", 
+        "amount": 0.1904
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.72, 
+        "invoice": 65, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59426
+    "pk": 61228
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.750Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.151Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.676Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.559Z", 
+        "amount": 0.2576, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 65, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59427
+    "pk": 61229
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.841Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.159Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.717Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.567Z", 
+        "amount": 0.3024
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 65, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59428
+    "pk": 61230
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.957Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.168Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.758Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.576Z", 
+        "amount": 0.336, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59429
+    "pk": 61231
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.048Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.176Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.800Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.584Z", 
+        "amount": 0.2016, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 65, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59430
+    "pk": 61232
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.139Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.184Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.841Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.592Z", 
+        "amount": 0.14
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 65, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59431
+    "pk": 61233
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.230Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.193Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.882Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.601Z", 
+        "amount": 0.14
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 65, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59432
+    "pk": 61234
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.512Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.201Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.924Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.609Z", 
+        "amount": 0.1232
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.76, 
+        "invoice": 65, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59433
+    "pk": 61235
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.769Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.209Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:17.965Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.617Z", 
+        "amount": 0.3136, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59434
+    "pk": 61236
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.860Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.217Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.007Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.626Z", 
+        "amount": 0.3024
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 65, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59435
+    "pk": 61237
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.959Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.226Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.048Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.634Z", 
+        "amount": 0.2968
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 65, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59436
+    "pk": 61238
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.050Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.234Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.090Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.642Z", 
+        "amount": 0.3192
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.56, 
+        "invoice": 65, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59437
+    "pk": 61239
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.141Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.242Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.131Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.651Z", 
+        "amount": 0.196, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.8, 
+        "invoice": 65, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59438
+    "pk": 61240
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.238Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.251Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.172Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.659Z", 
+        "amount": 0.1344
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.92, 
+        "invoice": 65, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59439
+    "pk": 61241
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.329Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.259Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.222Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.667Z", 
+        "amount": 0.1512
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.16, 
+        "invoice": 66, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59440
+    "pk": 61242
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.420Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.267Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.264Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.675Z", 
+        "amount": 0.3304
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 66, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59441
+    "pk": 61243
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.511Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.276Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.305Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.684Z", 
+        "amount": 0.1904
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.72, 
+        "invoice": 66, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59442
+    "pk": 61244
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.602Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.284Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.346Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.692Z", 
+        "amount": 0.2912
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 66, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59443
+    "pk": 61245
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.693Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.292Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.388Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.700Z", 
+        "amount": 0.3136, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 66, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59444
+    "pk": 61246
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.784Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.300Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.429Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.709Z", 
+        "amount": 0.28
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 66, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59445
+    "pk": 61247
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.875Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.309Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.471Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.717Z", 
+        "amount": 0.2856, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 66, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59446
+    "pk": 61248
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.966Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.317Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.512Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.725Z", 
+        "amount": 0.1176, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 66, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59447
+    "pk": 61249
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.058Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.325Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.553Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.733Z", 
+        "amount": 0.1736, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 66, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59448
+    "pk": 61250
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.149Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.334Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.595Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.742Z", 
+        "amount": 0.2184
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 66, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59449
+    "pk": 61251
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.240Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.342Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.637Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.750Z", 
+        "amount": 0.1624
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 66, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59450
+    "pk": 61252
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.331Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.350Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.678Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.758Z", 
+        "amount": 0.3192
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.56, 
+        "invoice": 66, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59451
+    "pk": 61253
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.424Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.358Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.719Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.767Z", 
+        "amount": 0.2856, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 66, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59452
+    "pk": 61254
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.515Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.367Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.761Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.775Z", 
+        "amount": 0.112
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.6, 
+        "invoice": 66, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59453
+    "pk": 61255
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.606Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.375Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.802Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.783Z", 
+        "amount": 0.2688
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 66, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59454
+    "pk": 61256
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.697Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.383Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.843Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.791Z", 
+        "amount": 0.1176, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 66, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59455
+    "pk": 61257
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.788Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.392Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.885Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.800Z", 
+        "amount": 0.2688
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 66, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59456
+    "pk": 61258
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.888Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.400Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.926Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.808Z", 
+        "amount": 0.2296, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 66, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59457
+    "pk": 61259
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.979Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.408Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:18.968Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.816Z", 
+        "amount": 0.224
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.2, 
+        "invoice": 66, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59458
+    "pk": 61260
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.070Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.416Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.009Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.824Z", 
+        "amount": 0.2856, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 66, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59459
+    "pk": 61261
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.161Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.425Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.051Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.833Z", 
+        "amount": 0.224
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.2, 
+        "invoice": 66, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59460
+    "pk": 61262
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.252Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.433Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.100Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.841Z", 
+        "amount": 0.2576, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 67, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59461
+    "pk": 61263
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.343Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.441Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.142Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.849Z", 
+        "amount": 0.2296, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 67, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59462
+    "pk": 61264
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.434Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.450Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.183Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.858Z", 
+        "amount": 0.2632
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 67, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59463
+    "pk": 61265
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.526Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.458Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.224Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.866Z", 
+        "amount": 0.2856, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 67, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59464
+    "pk": 61266
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.617Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.466Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.266Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.874Z", 
+        "amount": 0.336, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 67, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59465
+    "pk": 61267
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.708Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.474Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.307Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.882Z", 
+        "amount": 0.3136, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59466
+    "pk": 61268
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.799Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.483Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.349Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.891Z", 
+        "amount": 0.2968
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.24, 
+        "invoice": 67, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59467
+    "pk": 61269
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.890Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.491Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.390Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.899Z", 
+        "amount": 0.1904
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.72, 
+        "invoice": 67, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59468
+    "pk": 61270
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.981Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.499Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.432Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.907Z", 
+        "amount": 0.2184
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59469
+    "pk": 61271
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.072Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.507Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.473Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.916Z", 
+        "amount": 0.2352
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.36, 
+        "invoice": 67, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59470
+    "pk": 61272
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.170Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.516Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.514Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.924Z", 
+        "amount": 0.1176, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59471
+    "pk": 61273
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.261Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.524Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.556Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.932Z", 
+        "amount": 0.2464
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 67, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59472
+    "pk": 61274
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.352Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.532Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.597Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.940Z", 
+        "amount": 0.3136, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59473
+    "pk": 61275
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.443Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.541Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.639Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.949Z", 
+        "amount": 0.196, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.8, 
+        "invoice": 67, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59474
+    "pk": 61276
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.535Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.549Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.680Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.957Z", 
+        "amount": 0.1624
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 67, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59475
+    "pk": 61277
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.626Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.557Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.722Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.965Z", 
+        "amount": 0.1232
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.76, 
+        "invoice": 67, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59476
+    "pk": 61278
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.717Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.565Z", 
-        "amount": 0.56, 
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:19.763Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:13.974Z", 
+        "amount": 0.2296, 
+        "object": 118
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.28, 
+        "invoice": 67, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59477
+    "pk": 61279
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.574Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.574Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.813Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.982Z", 
+        "amount": 0.28, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 67, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59478
+    "pk": 61280
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.582Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.582Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.854Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.990Z", 
+        "amount": 0.2016, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 67, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59479
+    "pk": 61281
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.590Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.590Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.895Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:13.998Z", 
+        "amount": 0.1624, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 67, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59480
+    "pk": 61282
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.599Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.599Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.937Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.007Z", 
+        "amount": 0.2912, 
+        "object": 118, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.16, 
+        "invoice": 67, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59481
+    "pk": 61283
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.607Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.607Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.015Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.015Z", 
+        "amount": 0.1344
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 1.92
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59482
+    "pk": 61284
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.615Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.615Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.023Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.023Z", 
+        "amount": 0.1848
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.64
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59483
+    "pk": 61285
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.623Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.623Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.032Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.031Z", 
+        "amount": 0.2128
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.04
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59484
+    "pk": 61286
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.632Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.632Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.040Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.040Z", 
+        "amount": 0.2464
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.52
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59485
+    "pk": 61287
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.640Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.640Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.048Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.048Z", 
+        "amount": 0.2352
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.36
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59486
+    "pk": 61288
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.648Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.648Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.056Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.056Z", 
+        "amount": 0.2128
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.04
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59487
+    "pk": 61289
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.657Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.657Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.065Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.065Z", 
+        "amount": 0.14
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0, 
+        "coreHours": 2.0, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59488
+    "pk": 61290
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.665Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.665Z", 
-        "amount": 0.56
-        "object": 100
-        "account": 13
+        "updated": "2013-12-18T21:29:14.073Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.073Z", 
+        "amount": 0.1792
+        "object": 118
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.56
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59489
+    "pk": 61291
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.673Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.673Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.444Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.088Z", 
+        "amount": 0.1232, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 1.76, 
+        "invoice": 64, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59490
+    "pk": 61292
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:52.682Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:52.681Z", 
-        "amount": 0.56, 
-        "object": 100, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.485Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.098Z", 
+        "amount": 0.1288, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 1.84, 
+        "invoice": 64, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59491
+    "pk": 61293
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.407Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.696Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.527Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.106Z", 
+        "amount": 0.2856, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 58, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 64, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59492
+    "pk": 61294
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.507Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.706Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.568Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.114Z", 
+        "amount": 0.14
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59493
+    "pk": 61295
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.598Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.715Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.609Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.123Z", 
+        "amount": 0.3136, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59494
+    "pk": 61296
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.689Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.723Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.651Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.131Z", 
+        "amount": 0.1792
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.56, 
+        "invoice": 64, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59495
+    "pk": 61297
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.780Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.731Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.692Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.139Z", 
+        "amount": 0.252
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.6, 
+        "invoice": 64, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59496
+    "pk": 61298
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.871Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.739Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.734Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.148Z", 
+        "amount": 0.2464
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 64, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59497
+    "pk": 61299
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.980Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.748Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.775Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.156Z", 
+        "amount": 0.2184
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 64, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59498
+    "pk": 61300
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.071Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.756Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.816Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.164Z", 
+        "amount": 0.252
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.6, 
+        "invoice": 64, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59499
+    "pk": 61301
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.162Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.764Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.858Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.172Z", 
+        "amount": 0.1624
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 64, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59500
+    "pk": 61302
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.253Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.773Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.899Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.181Z", 
+        "amount": 0.2072
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59501
+    "pk": 61303
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.377Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.781Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.941Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.189Z", 
+        "amount": 0.1904
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.72, 
+        "invoice": 64, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59502
+    "pk": 61304
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.468Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.789Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:16.982Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.197Z", 
+        "amount": 0.2856, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 64, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59503
+    "pk": 61305
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.559Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.798Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.024Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.206Z", 
+        "amount": 0.2016, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 59, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.88, 
+        "invoice": 64, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59504
+    "pk": 61306
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.659Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.806Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.065Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.214Z", 
+        "amount": 0.2184
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 64, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59505
+    "pk": 61307
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.762Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.814Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.106Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.222Z", 
+        "amount": 0.14
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59506
+    "pk": 61308
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.853Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.822Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.148Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.230Z", 
+        "amount": 0.1288
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.84, 
+        "invoice": 64, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59507
+    "pk": 61309
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:59.944Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.831Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.189Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.239Z", 
+        "amount": 0.2632
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 64, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59508
+    "pk": 61310
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.035Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.839Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.253Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.247Z", 
+        "amount": 0.2856, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 65, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59509
+    "pk": 61311
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.126Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.847Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.314Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.255Z", 
+        "amount": 0.1568
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.24, 
+        "invoice": 65, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59510
+    "pk": 61312
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.217Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.856Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.361Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.264Z", 
+        "amount": 0.2352
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.36, 
+        "invoice": 65, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59511
+    "pk": 61313
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.309Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.864Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.402Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.272Z", 
+        "amount": 0.2352
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.36, 
+        "invoice": 65, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59512
+    "pk": 61314
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.402Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.872Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.443Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.280Z", 
+        "amount": 0.3304
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.72, 
+        "invoice": 65, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59513
+    "pk": 61315
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.493Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.880Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.485Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.288Z", 
+        "amount": 0.2408
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.44, 
+        "invoice": 65, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59514
+    "pk": 61316
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.584Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.889Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.601Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.297Z", 
+        "amount": 0.2912
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.16, 
+        "invoice": 65, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59515
+    "pk": 61317
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.692Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.897Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.642Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.305Z", 
+        "amount": 0.2688
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.84, 
+        "invoice": 65, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59516
+    "pk": 61318
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.783Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.905Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.684Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.313Z", 
+        "amount": 0.168
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.4, 
+        "invoice": 65, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59517
+    "pk": 61319
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.874Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.913Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.725Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.322Z", 
+        "amount": 0.1792
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.56, 
+        "invoice": 65, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59518
+    "pk": 61320
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:00.990Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.922Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.767Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.330Z", 
+        "amount": 0.2184
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 65, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59519
+    "pk": 61321
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.081Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.930Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.808Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.338Z", 
+        "amount": 0.1848
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.64, 
+        "invoice": 65, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59520
+    "pk": 61322
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.172Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.938Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.849Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.346Z", 
+        "amount": 0.1792
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.56, 
+        "invoice": 65, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59521
+    "pk": 61323
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.338Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.947Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.891Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.355Z", 
+        "amount": 0.112
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.6, 
+        "invoice": 65, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59522
+    "pk": 61324
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.678Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.955Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.932Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.363Z", 
+        "amount": 0.3136, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59523
+    "pk": 61325
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.802Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.963Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:17.974Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.371Z", 
+        "amount": 0.1568
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.24, 
+        "invoice": 65, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59524
+    "pk": 61326
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.893Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.971Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.015Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.380Z", 
+        "amount": 0.3024
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 60, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 65, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59525
+    "pk": 61327
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:01.992Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.980Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.057Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.388Z", 
+        "amount": 0.336, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59526
+    "pk": 61328
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.084Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.988Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.098Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.396Z", 
+        "amount": 0.28
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 65, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59527
+    "pk": 61329
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.175Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:52.996Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.139Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.404Z", 
+        "amount": 0.3136, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59528
+    "pk": 61330
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.271Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.005Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.181Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.413Z", 
+        "amount": 0.1176, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 65, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59529
+    "pk": 61331
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.362Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.013Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.231Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.421Z", 
+        "amount": 0.3248
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.64, 
+        "invoice": 66, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59530
+    "pk": 61332
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.453Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.021Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.272Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.429Z", 
+        "amount": 0.1288
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.84, 
+        "invoice": 66, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59531
+    "pk": 61333
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.544Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.029Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.313Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.437Z", 
+        "amount": 0.1848
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.64, 
+        "invoice": 66, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59532
+    "pk": 61334
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.635Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.038Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.355Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.446Z", 
+        "amount": 0.168
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.4, 
+        "invoice": 66, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59533
+    "pk": 61335
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.726Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.046Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.396Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.454Z", 
+        "amount": 0.1624
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.32, 
+        "invoice": 66, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59534
+    "pk": 61336
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.817Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.054Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.438Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.462Z", 
+        "amount": 0.112
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.6, 
+        "invoice": 66, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59535
+    "pk": 61337
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:02.909Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.063Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.479Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.471Z", 
+        "amount": 0.2184
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.12, 
+        "invoice": 66, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59536
+    "pk": 61338
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.000Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.071Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.520Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.479Z", 
+        "amount": 0.2576, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 66, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59537
+    "pk": 61339
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.099Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.079Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.562Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.487Z", 
+        "amount": 0.2072
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 66, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59538
+    "pk": 61340
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.190Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.087Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.603Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.495Z", 
+        "amount": 0.1232
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.76, 
+        "invoice": 66, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59539
+    "pk": 61341
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.281Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.096Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.645Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.504Z", 
+        "amount": 0.2632
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 66, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59540
+    "pk": 61342
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.373Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.104Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.686Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.512Z", 
+        "amount": 0.14
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.0, 
+        "invoice": 66, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59541
+    "pk": 61343
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.465Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.112Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.728Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.520Z", 
+        "amount": 0.196, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.8, 
+        "invoice": 66, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59542
+    "pk": 61344
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.556Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.120Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.769Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.529Z", 
+        "amount": 0.2576, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 66, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59543
+    "pk": 61345
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.647Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.129Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.810Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.537Z", 
+        "amount": 0.168
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.4, 
+        "invoice": 66, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59544
+    "pk": 61346
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.739Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.137Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.852Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.545Z", 
+        "amount": 0.2464
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 66, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59545
+    "pk": 61347
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.821Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.145Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.893Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.553Z", 
+        "amount": 0.336, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 61, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.8, 
+        "invoice": 66, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59546
+    "pk": 61348
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:03.921Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.154Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.935Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.562Z", 
+        "amount": 0.2464
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.52, 
+        "invoice": 66, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59547
+    "pk": 61349
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.012Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.162Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:18.976Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.570Z", 
+        "amount": 0.2576, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 66, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59548
+    "pk": 61350
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.103Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.170Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.017Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.578Z", 
+        "amount": 0.1736, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 66, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59549
+    "pk": 61351
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.194Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.178Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.059Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.587Z", 
+        "amount": 0.3024
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 66, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59550
+    "pk": 61352
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.285Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.187Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.109Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.595Z", 
+        "amount": 0.1848
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.64, 
+        "invoice": 67, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59551
+    "pk": 61353
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.376Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.195Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.150Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.603Z", 
+        "amount": 0.3024
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 67, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59552
+    "pk": 61354
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.467Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.203Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.191Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.611Z", 
+        "amount": 0.2856, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.08, 
+        "invoice": 67, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59553
+    "pk": 61355
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.559Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.212Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.233Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.620Z", 
+        "amount": 0.3136, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59554
+    "pk": 61356
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.650Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.220Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.274Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.628Z", 
+        "amount": 0.1176, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59555
+    "pk": 61357
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.741Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.228Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.316Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.636Z", 
+        "amount": 0.2072
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.96, 
+        "invoice": 67, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59556
+    "pk": 61358
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.832Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.237Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.357Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.645Z", 
+        "amount": 0.2632
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.76, 
+        "invoice": 67, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59557
+    "pk": 61359
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:04.923Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.245Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.398Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.653Z", 
+        "amount": 0.2408
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.44, 
+        "invoice": 67, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59558
+    "pk": 61360
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.023Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.253Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.440Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.661Z", 
+        "amount": 0.2744
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.92, 
+        "invoice": 67, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59559
+    "pk": 61361
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.120Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.261Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.481Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.669Z", 
+        "amount": 0.3024
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 67, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59560
+    "pk": 61362
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.212Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.270Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.523Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.678Z", 
+        "amount": 0.1848
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.64, 
+        "invoice": 67, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59561
+    "pk": 61363
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.303Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.278Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.564Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.686Z", 
+        "amount": 0.168
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.4, 
+        "invoice": 67, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59562
+    "pk": 61364
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.394Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.286Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.606Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.694Z", 
+        "amount": 0.2576, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.68, 
+        "invoice": 67, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59563
+    "pk": 61365
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.485Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.295Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.647Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.702Z", 
+        "amount": 0.3024
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.32, 
+        "invoice": 67, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59564
+    "pk": 61366
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.576Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.303Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.688Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.711Z", 
+        "amount": 0.28
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 4.0, 
+        "invoice": 67, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59565
+    "pk": 61367
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.667Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.311Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.730Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.719Z", 
+        "amount": 0.224
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 3.2, 
+        "invoice": 67, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59566
+    "pk": 61368
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:20:05.758Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.319Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:19.771Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.727Z", 
+        "amount": 0.1736, 
+        "object": 119
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 8.0, 
-        "invoice": 62, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "reservation"
+        "coreHours": 2.48, 
+        "invoice": 67, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59567
+    "pk": 61369
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.328Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.328Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.821Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.736Z", 
+        "amount": 0.3136, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59568
+    "pk": 61370
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.336Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.336Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.862Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.744Z", 
+        "amount": 0.2352, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.36, 
+        "invoice": 67, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59569
+    "pk": 61371
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.344Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.344Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.904Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.752Z", 
+        "amount": 0.28, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.0, 
+        "invoice": 67, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59570
+    "pk": 61372
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.353Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.352Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:19.945Z", 
+        "slice": 14, 
+        "created": "2013-12-18T21:29:14.761Z", 
+        "amount": 0.2184, 
+        "object": 119, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59571
+    "pk": 61373
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.361Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.361Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.769Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.769Z", 
+        "amount": 0.1288
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 1.84
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59572
+    "pk": 61374
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.369Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.369Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.777Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.777Z", 
+        "amount": 0.3136, 
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 4.48
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59573
+    "pk": 61375
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.377Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.377Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.785Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.785Z", 
+        "amount": 0.1456, 
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.08
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59574
+    "pk": 61376
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.386Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.386Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.794Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.794Z", 
+        "amount": 0.3192
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 4.56
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59575
+    "pk": 61377
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.394Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.394Z", 
-        "amount": 0.56, 
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.802Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.802Z", 
+        "amount": 0.1456, 
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 2.08
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59576
+    "pk": 61378
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.402Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.402Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.810Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.810Z", 
+        "amount": 0.3304
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 4.72
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59577
+    "pk": 61379
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.411Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.410Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.818Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.818Z", 
+        "amount": 0.28
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0, 
+        "coreHours": 4.0, 
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59578
+    "pk": 61380
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.419Z", 
-        "slice": 13
-        "created": "2013-12-13T22:19:53.419Z", 
-        "amount": 0.56
-        "object": 101
-        "account": 13
+        "updated": "2013-12-18T21:29:14.827Z", 
+        "slice": 14
+        "created": "2013-12-18T21:29:14.827Z", 
+        "amount": 0.2352
+        "object": 119
+        "account": 14
         "state": "pending", 
-        "coreHours": 8.0
+        "coreHours": 3.36
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "reservation"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59579
+    "pk": 61381
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.427Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.427Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.452Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:29:14.858Z", 
+        "amount": 0.252, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.6, 
+        "invoice": 64, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59580
+    "pk": 61382
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:53.435Z", 
-        "slice": 13, 
-        "created": "2013-12-13T22:19:53.435Z", 
-        "amount": 0.56, 
-        "object": 101, 
-        "account": 13, 
-        "state": "pending", 
-        "coreHours": 8.0, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "reservation"
+        "updated": "2013-12-18T21:29:16.494Z", 
+        "slice": 15, 
+        "created": "2013-12-18T21:29:14.868Z", 
+        "amount": 0.2688, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 64, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59581
+    "pk": 61383
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.051Z", 
+        "updated": "2013-12-18T21:29:16.535Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.467Z", 
-        "amount": 0.14
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.876Z", 
+        "amount": 0.1736
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 54, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 64, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59582
+    "pk": 61384
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.092Z", 
+        "updated": "2013-12-18T21:29:16.576Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.477Z", 
-        "amount": 0.3024, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.885Z", 
+        "amount": 0.2464, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 54, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 64, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59583
+    "pk": 61385
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.134Z", 
+        "updated": "2013-12-18T21:29:16.618Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.485Z", 
-        "amount": 0.1512
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.893Z", 
+        "amount": 0.196
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 54, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 64, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59584
+    "pk": 61386
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.175Z", 
+        "updated": "2013-12-18T21:29:16.659Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.493Z", 
-        "amount": 0.2464
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.901Z", 
+        "amount": 0.1232
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 54, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.76, 
+        "invoice": 64, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59585
+    "pk": 61387
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.216Z", 
+        "updated": "2013-12-18T21:29:16.700Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.502Z", 
-        "amount": 0.224, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.910Z", 
+        "amount": 0.14, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 54, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59586
+    "pk": 61388
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.258Z", 
+        "updated": "2013-12-18T21:29:16.742Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.510Z", 
-        "amount": 0.2464, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.918Z", 
+        "amount": 0.1624, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 54, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 64, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59587
+    "pk": 61389
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.299Z", 
+        "updated": "2013-12-18T21:29:16.783Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.518Z", 
-        "amount": 0.336, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.926Z", 
+        "amount": 0.196, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 54, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 64, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59588
+    "pk": 61390
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.341Z", 
+        "updated": "2013-12-18T21:29:16.825Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.527Z", 
-        "amount": 0.308
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.934Z", 
+        "amount": 0.196
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 54, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 64, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59589
+    "pk": 61391
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.382Z", 
+        "updated": "2013-12-18T21:29:16.866Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.535Z", 
-        "amount": 0.2184
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.943Z", 
+        "amount": 0.1792
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 54, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 64, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59590
+    "pk": 61392
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.423Z", 
+        "updated": "2013-12-18T21:29:16.908Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.543Z", 
-        "amount": 0.2352
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.951Z", 
+        "amount": 0.168
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 54, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 64, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59591
+    "pk": 61393
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.465Z", 
+        "updated": "2013-12-18T21:29:16.949Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.551Z", 
-        "amount": 0.2072
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.959Z", 
+        "amount": 0.1624
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 54, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 64, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59592
+    "pk": 61394
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.506Z", 
+        "updated": "2013-12-18T21:29:16.990Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.560Z", 
-        "amount": 0.2128, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.968Z", 
+        "amount": 0.2968, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 54, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 64, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59593
+    "pk": 61395
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.548Z", 
+        "updated": "2013-12-18T21:29:17.032Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.568Z", 
-        "amount": 0.252
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.976Z", 
+        "amount": 0.3136
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 54, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59594
+    "pk": 61396
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.622Z", 
+        "updated": "2013-12-18T21:29:17.073Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.576Z", 
-        "amount": 0.1792
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:14.984Z", 
+        "amount": 0.2576
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 55, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 64, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59595
+    "pk": 61397
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.664Z", 
+        "updated": "2013-12-18T21:29:17.115Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.584Z", 
+        "created": "2013-12-18T21:29:14.992Z", 
         "amount": 0.196, 
-        "object": 102
-        "account": 12
+        "object": 120
+        "account": 14
         "state": "invoiced", 
         "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 64, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59596
+    "pk": 61398
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.705Z", 
+        "updated": "2013-12-18T21:29:17.156Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.593Z", 
-        "amount": 0.2632, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.001Z", 
+        "amount": 0.2912, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 55, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 64, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59597
+    "pk": 61399
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.747Z", 
+        "updated": "2013-12-18T21:29:17.198Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.601Z", 
-        "amount": 0.1344
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.009Z", 
+        "amount": 0.2352
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 55, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 64, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59598
+    "pk": 61400
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.788Z", 
+        "updated": "2013-12-18T21:29:17.264Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.609Z", 
-        "amount": 0.3192
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.017Z", 
+        "amount": 0.1176
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 55, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 65, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59599
+    "pk": 61401
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.830Z", 
+        "updated": "2013-12-18T21:29:17.328Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.618Z", 
-        "amount": 0.1176
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.025Z", 
+        "amount": 0.3024
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 55, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 65, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59600
+    "pk": 61402
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.871Z", 
+        "updated": "2013-12-18T21:29:17.369Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.626Z", 
-        "amount": 0.2464
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.034Z", 
+        "amount": 0.3136
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 55, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59601
+    "pk": 61403
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.912Z", 
+        "updated": "2013-12-18T21:29:17.410Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.634Z", 
-        "amount": 0.336
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.042Z", 
+        "amount": 0.2744
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 55, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 65, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59602
+    "pk": 61404
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.954Z", 
+        "updated": "2013-12-18T21:29:17.452Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.642Z", 
-        "amount": 0.3248
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.050Z", 
+        "amount": 0.336
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 55, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59603
+    "pk": 61405
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.995Z", 
+        "updated": "2013-12-18T21:29:17.493Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.651Z", 
-        "amount": 0.2856
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.059Z", 
+        "amount": 0.2184
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 55, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 65, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59604
+    "pk": 61406
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.036Z", 
+        "updated": "2013-12-18T21:29:17.609Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.659Z", 
-        "amount": 0.2296, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.067Z", 
+        "amount": 0.1176, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.28, 
-        "invoice": 55, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 65, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59605
+    "pk": 61407
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.078Z", 
+        "updated": "2013-12-18T21:29:17.651Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.667Z", 
-        "amount": 0.2128
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.075Z", 
+        "amount": 0.196
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 55, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 65, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59606
+    "pk": 61408
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.119Z", 
+        "updated": "2013-12-18T21:29:17.692Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.676Z", 
-        "amount": 0.252, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.084Z", 
+        "amount": 0.1512, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 55, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.16, 
+        "invoice": 65, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59607
+    "pk": 61409
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.161Z", 
+        "updated": "2013-12-18T21:29:17.733Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.684Z", 
-        "amount": 0.1904
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.092Z", 
+        "amount": 0.196
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 55, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 65, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59608
+    "pk": 61410
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.202Z", 
+        "updated": "2013-12-18T21:29:17.775Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.692Z", 
-        "amount": 0.1736
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.100Z", 
+        "amount": 0.2128
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 55, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 65, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59609
+    "pk": 61411
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.244Z", 
+        "updated": "2013-12-18T21:29:17.816Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.700Z", 
-        "amount": 0.2912, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.108Z", 
+        "amount": 0.3192, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 55, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.56, 
+        "invoice": 65, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59610
+    "pk": 61412
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.285Z", 
+        "updated": "2013-12-18T21:29:17.858Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.709Z", 
-        "amount": 0.14, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.117Z", 
+        "amount": 0.224, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 55, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 65, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59611
+    "pk": 61413
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.327Z", 
+        "updated": "2013-12-18T21:29:17.899Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.717Z", 
-        "amount": 0.3304, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.125Z", 
+        "amount": 0.1624, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 55, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 65, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59612
+    "pk": 61414
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.368Z", 
+        "updated": "2013-12-18T21:29:17.940Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.725Z", 
-        "amount": 0.1344
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.133Z", 
+        "amount": 0.336
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.92, 
-        "invoice": 55, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59613
+    "pk": 61415
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.409Z", 
+        "updated": "2013-12-18T21:29:17.982Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.734Z", 
-        "amount": 0.2352
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.142Z", 
+        "amount": 0.1288
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 65, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59614
+    "pk": 61416
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.451Z", 
+        "updated": "2013-12-18T21:29:18.023Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.742Z", 
-        "amount": 0.2352
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.150Z", 
+        "amount": 0.2016
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.88, 
+        "invoice": 65, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59615
+    "pk": 61417
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.500Z", 
+        "updated": "2013-12-18T21:29:18.065Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.750Z", 
-        "amount": 0.2856, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.158Z", 
+        "amount": 0.2296, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 56, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 65, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59616
+    "pk": 61418
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.542Z", 
+        "updated": "2013-12-18T21:29:18.106Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.758Z", 
-        "amount": 0.1176
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.166Z", 
+        "amount": 0.1568
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 56, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 65, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59617
+    "pk": 61419
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.583Z", 
+        "updated": "2013-12-18T21:29:18.148Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.767Z", 
-        "amount": 0.3304
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.175Z", 
+        "amount": 0.2912
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 56, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 65, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59618
+    "pk": 61420
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.625Z", 
+        "updated": "2013-12-18T21:29:18.189Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.775Z", 
-        "amount": 0.1288
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.183Z", 
+        "amount": 0.1176
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 56, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 65, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59619
+    "pk": 61421
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.668Z", 
+        "updated": "2013-12-18T21:29:18.239Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.783Z", 
-        "amount": 0.1904, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.191Z", 
+        "amount": 0.14, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 56, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 66, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59620
+    "pk": 61422
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.709Z", 
+        "updated": "2013-12-18T21:29:18.280Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.792Z", 
-        "amount": 0.2184
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.200Z", 
+        "amount": 0.1456
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 56, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 66, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59621
+    "pk": 61423
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.751Z", 
+        "updated": "2013-12-18T21:29:18.321Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.800Z", 
-        "amount": 0.2016
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.208Z", 
+        "amount": 0.1848
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 56, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 66, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59622
+    "pk": 61424
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.792Z", 
+        "updated": "2013-12-18T21:29:18.363Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.808Z", 
-        "amount": 0.2856
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.216Z", 
+        "amount": 0.2688
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 56, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 66, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59623
+    "pk": 61425
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.833Z", 
+        "updated": "2013-12-18T21:29:18.404Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.816Z", 
-        "amount": 0.3024
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.224Z", 
+        "amount": 0.252
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 56, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 66, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59624
+    "pk": 61426
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.875Z", 
+        "updated": "2013-12-18T21:29:18.446Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.825Z", 
-        "amount": 0.1232
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.233Z", 
+        "amount": 0.3304
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 56, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 66, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59625
+    "pk": 61427
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.916Z", 
+        "updated": "2013-12-18T21:29:18.487Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.833Z", 
-        "amount": 0.252
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.241Z", 
+        "amount": 0.2968
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 56, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 66, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59626
+    "pk": 61428
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.958Z", 
+        "updated": "2013-12-18T21:29:18.529Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.841Z", 
-        "amount": 0.224
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.249Z", 
+        "amount": 0.2072
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 56, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 66, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59627
+    "pk": 61429
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.999Z", 
+        "updated": "2013-12-18T21:29:18.570Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.850Z", 
-        "amount": 0.336
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.258Z", 
+        "amount": 0.2408
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 56, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 66, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59628
+    "pk": 61430
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.041Z", 
+        "updated": "2013-12-18T21:29:18.611Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.858Z", 
-        "amount": 0.336, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.266Z", 
+        "amount": 0.196, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 56, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 66, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59629
+    "pk": 61431
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.082Z", 
+        "updated": "2013-12-18T21:29:18.653Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.866Z", 
-        "amount": 0.1512
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.274Z", 
+        "amount": 0.1568
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 56, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 66, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59630
+    "pk": 61432
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.115Z", 
+        "updated": "2013-12-18T21:29:18.694Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.874Z", 
-        "amount": 0.112, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.282Z", 
+        "amount": 0.1792, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 66, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59631
+    "pk": 61433
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.156Z", 
+        "updated": "2013-12-18T21:29:18.736Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.883Z", 
-        "amount": 0.3304, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.291Z", 
+        "amount": 0.14, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 56, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 66, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59632
+    "pk": 61434
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.198Z", 
+        "updated": "2013-12-18T21:29:18.777Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.891Z", 
-        "amount": 0.112
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.299Z", 
+        "amount": 0.1904
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 66, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59633
+    "pk": 61435
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.239Z", 
+        "updated": "2013-12-18T21:29:18.819Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.899Z", 
-        "amount": 0.14
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.307Z", 
+        "amount": 0.1568
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 56, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 66, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59634
+    "pk": 61436
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.281Z", 
+        "updated": "2013-12-18T21:29:18.860Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.908Z", 
-        "amount": 0.2912
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.315Z", 
+        "amount": 0.196
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 56, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 66, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59635
+    "pk": 61437
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.322Z", 
+        "updated": "2013-12-18T21:29:18.901Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.916Z", 
-        "amount": 0.2072
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.324Z", 
+        "amount": 0.1624
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 56, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 66, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59636
+    "pk": 61438
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.372Z", 
+        "updated": "2013-12-18T21:29:18.943Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.924Z", 
-        "amount": 0.2688
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.332Z", 
+        "amount": 0.2912
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 57, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 66, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59637
+    "pk": 61439
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.413Z", 
+        "updated": "2013-12-18T21:29:18.984Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.932Z", 
-        "amount": 0.196
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.340Z", 
+        "amount": 0.2352
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 57, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 66, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59638
+    "pk": 61440
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.455Z", 
+        "updated": "2013-12-18T21:29:19.026Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.941Z", 
-        "amount": 0.1232
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.348Z", 
+        "amount": 0.1736
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 57, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 66, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59639
+    "pk": 61441
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.496Z", 
+        "updated": "2013-12-18T21:29:19.067Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.949Z", 
-        "amount": 0.308
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.357Z", 
+        "amount": 0.336
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 57, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 66, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59640
+    "pk": 61442
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.538Z", 
+        "updated": "2013-12-18T21:29:19.117Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.957Z", 
-        "amount": 0.2688
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.365Z", 
+        "amount": 0.3136
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 57, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59641
+    "pk": 61443
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.579Z", 
+        "updated": "2013-12-18T21:29:19.158Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.966Z", 
-        "amount": 0.112
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.373Z", 
+        "amount": 0.2744
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 57, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 67, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59642
+    "pk": 61444
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.620Z", 
+        "updated": "2013-12-18T21:29:19.200Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.974Z", 
-        "amount": 0.28
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.382Z", 
+        "amount": 0.1176
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 57, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59643
+    "pk": 61445
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.662Z", 
+        "updated": "2013-12-18T21:29:19.241Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.982Z", 
-        "amount": 0.3024
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.390Z", 
+        "amount": 0.1456
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 57, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59644
+    "pk": 61446
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.703Z", 
+        "updated": "2013-12-18T21:29:19.283Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.990Z", 
-        "amount": 0.1512
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.398Z", 
+        "amount": 0.1344
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 57, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 67, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59645
+    "pk": 61447
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.745Z", 
+        "updated": "2013-12-18T21:29:19.324Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:53.999Z", 
-        "amount": 0.14, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.407Z", 
+        "amount": 0.1456
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 57, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59646
+    "pk": 61448
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.786Z", 
+        "updated": "2013-12-18T21:29:19.365Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.007Z", 
-        "amount": 0.14
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.415Z", 
+        "amount": 0.112
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 57, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 67, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59647
+    "pk": 61449
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.828Z", 
+        "updated": "2013-12-18T21:29:19.407Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.015Z", 
+        "created": "2013-12-18T21:29:15.423Z", 
         "amount": 0.14, 
-        "object": 102
-        "account": 12
+        "object": 120
+        "account": 14
         "state": "invoiced", 
         "coreHours": 2.0, 
-        "invoice": 57, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 67, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59648
+    "pk": 61450
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.869Z", 
+        "updated": "2013-12-18T21:29:19.448Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.024Z", 
-        "amount": 0.2632
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.431Z", 
+        "amount": 0.2744
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 57, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 67, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59649
+    "pk": 61451
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.910Z", 
+        "updated": "2013-12-18T21:29:19.490Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.032Z", 
-        "amount": 0.2632
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.440Z", 
+        "amount": 0.2408
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 57, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 67, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59650
+    "pk": 61452
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.952Z", 
+        "updated": "2013-12-18T21:29:19.531Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.040Z", 
-        "amount": 0.2856
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.448Z", 
+        "amount": 0.1848
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.08, 
-        "invoice": 57, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 67, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59651
+    "pk": 61453
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.993Z", 
+        "updated": "2013-12-18T21:29:19.572Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.048Z", 
-        "amount": 0.2744
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.456Z", 
+        "amount": 0.308
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 67, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59652
+    "pk": 61454
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.035Z", 
+        "updated": "2013-12-18T21:29:19.614Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.057Z", 
-        "amount": 0.2632
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.464Z", 
+        "amount": 0.1568
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.76, 
-        "invoice": 57, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 67, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59653
+    "pk": 61455
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.076Z", 
+        "updated": "2013-12-18T21:29:19.655Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.065Z", 
-        "amount": 0.1176
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.473Z", 
+        "amount": 0.14
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 57, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 67, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59654
+    "pk": 61456
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.117Z", 
+        "updated": "2013-12-18T21:29:19.697Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.073Z", 
-        "amount": 0.1792
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.481Z", 
+        "amount": 0.1568
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 57, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 67, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59655
+    "pk": 61457
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.159Z", 
+        "updated": "2013-12-18T21:29:19.738Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.081Z", 
-        "amount": 0.1456, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.489Z", 
+        "amount": 0.336, 
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 57, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 67, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59656
+    "pk": 61458
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.200Z", 
+        "updated": "2013-12-18T21:29:19.779Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.090Z", 
-        "amount": 0.1176
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.498Z", 
+        "amount": 0.2072
+        "object": 120
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 57, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 67, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59657
+    "pk": 61459
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.098Z", 
+        "updated": "2013-12-18T21:29:19.829Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.098Z", 
-        "amount": 0.2464, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.52, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.506Z", 
+        "amount": 0.2688, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.84, 
+        "invoice": 67, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59658
+    "pk": 61460
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.106Z", 
+        "updated": "2013-12-18T21:29:19.871Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.106Z", 
-        "amount": 0.252, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.6, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.516Z", 
+        "amount": 0.3248, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.64, 
+        "invoice": 67, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59659
+    "pk": 61461
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.115Z", 
+        "updated": "2013-12-18T21:29:19.912Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.115Z", 
-        "amount": 0.2016, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.88, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.524Z", 
+        "amount": 0.1624, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.32, 
+        "invoice": 67, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59660
+    "pk": 61462
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.123Z", 
+        "updated": "2013-12-18T21:29:19.953Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.123Z", 
-        "amount": 0.3024, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.32, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.533Z", 
+        "amount": 0.1176, 
+        "object": 120, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 1.68, 
+        "invoice": 67, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59661
+    "pk": 61463
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.131Z", 
+        "updated": "2013-12-18T21:29:15.541Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.131Z", 
+        "created": "2013-12-18T21:29:15.541Z", 
         "amount": 0.3192, 
-        "object": 102
-        "account": 12
+        "object": 120
+        "account": 14
         "state": "pending", 
         "coreHours": 4.56, 
         "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59662
+    "pk": 61464
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.140Z", 
+        "updated": "2013-12-18T21:29:15.549Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.139Z", 
-        "amount": 0.336, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.549Z", 
+        "amount": 0.3136, 
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 4.8, 
+        "coreHours": 4.48, 
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59663
+    "pk": 61465
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.148Z", 
+        "updated": "2013-12-18T21:29:15.557Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.148Z", 
-        "amount": 0.3024
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.557Z", 
+        "amount": 0.1456
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 4.32
+        "coreHours": 2.08
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59664
+    "pk": 61466
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.156Z", 
+        "updated": "2013-12-18T21:29:15.566Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.156Z", 
-        "amount": 0.2128, 
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.566Z", 
+        "amount": 0.28, 
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 3.04
+        "coreHours": 4.0
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59665
+    "pk": 61467
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.164Z", 
+        "updated": "2013-12-18T21:29:15.574Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.164Z", 
-        "amount": 0.2296
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.574Z", 
+        "amount": 0.2072
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 3.28
+        "coreHours": 2.96
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59666
+    "pk": 61468
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.173Z", 
+        "updated": "2013-12-18T21:29:15.582Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.173Z", 
-        "amount": 0.1288
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.582Z", 
+        "amount": 0.2352
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 1.84
+        "coreHours": 3.36
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59667
+    "pk": 61469
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.181Z", 
+        "updated": "2013-12-18T21:29:15.591Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.181Z", 
-        "amount": 0.2912
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.590Z", 
+        "amount": 0.336
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 4.16
+        "coreHours": 4.8
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59668
+    "pk": 61470
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.189Z", 
+        "updated": "2013-12-18T21:29:15.599Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.189Z", 
-        "amount": 0.224
-        "object": 102
-        "account": 12
+        "created": "2013-12-18T21:29:15.599Z", 
+        "amount": 0.1232
+        "object": 120
+        "account": 14
         "state": "pending", 
-        "coreHours": 3.2
+        "coreHours": 1.76
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59669
+    "pk": 61471
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.197Z", 
+        "updated": "2013-12-18T21:29:16.460Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.197Z", 
-        "amount": 0.168, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 2.4, 
-        "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.614Z", 
+        "amount": 0.1848, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.64, 
+        "invoice": 64, 
+        "date": "2013-11-18T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59670
+    "pk": 61472
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.206Z", 
+        "updated": "2013-12-18T21:29:16.502Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.206Z", 
-        "amount": 0.3136, 
-        "object": 102, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.48, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:15.624Z", 
+        "amount": 0.2464, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.52, 
+        "invoice": 64, 
+        "date": "2013-11-19T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59671
+    "pk": 61473
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.034Z", 
+        "updated": "2013-12-18T21:29:16.543Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.221Z", 
-        "amount": 0.1176, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.632Z", 
+        "amount": 0.1456, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.68, 
-        "invoice": 53, 
-        "date": "2013-11-13T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 64, 
+        "date": "2013-11-19T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59672
+    "pk": 61474
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.084Z", 
+        "updated": "2013-12-18T21:29:16.585Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.231Z", 
-        "amount": 0.2968
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.640Z", 
+        "amount": 0.2184
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 54, 
-        "date": "2013-11-14T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 64, 
+        "date": "2013-11-19T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59673
+    "pk": 61475
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.125Z", 
+        "updated": "2013-12-18T21:29:16.626Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.239Z", 
-        "amount": 0.2016
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.649Z", 
+        "amount": 0.252
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 54, 
-        "date": "2013-11-14T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 64, 
+        "date": "2013-11-20T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59674
+    "pk": 61476
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.167Z", 
+        "updated": "2013-12-18T21:29:16.667Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.247Z", 
-        "amount": 0.224
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.657Z", 
+        "amount": 0.2352
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 54, 
-        "date": "2013-11-14T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.36, 
+        "invoice": 64, 
+        "date": "2013-11-20T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59675
+    "pk": 61477
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.208Z", 
+        "updated": "2013-12-18T21:29:16.709Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.255Z", 
-        "amount": 0.308, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.665Z", 
+        "amount": 0.2408, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.4, 
-        "invoice": 54, 
-        "date": "2013-11-15T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 64, 
+        "date": "2013-11-20T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59676
+    "pk": 61478
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.250Z", 
+        "updated": "2013-12-18T21:29:16.750Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.264Z", 
-        "amount": 0.1288, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.673Z", 
+        "amount": 0.168, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 54, 
-        "date": "2013-11-15T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 64, 
+        "date": "2013-11-21T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59677
+    "pk": 61479
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.291Z", 
+        "updated": "2013-12-18T21:29:16.792Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.272Z", 
-        "amount": 0.112
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.682Z", 
+        "amount": 0.1904
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 54, 
-        "date": "2013-11-15T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 64, 
+        "date": "2013-11-21T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59678
+    "pk": 61480
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.332Z", 
+        "updated": "2013-12-18T21:29:16.833Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.280Z", 
-        "amount": 0.1568
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.690Z", 
+        "amount": 0.14
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.24, 
-        "invoice": 54, 
-        "date": "2013-11-16T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.0, 
+        "invoice": 64, 
+        "date": "2013-11-21T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59679
+    "pk": 61481
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.374Z", 
+        "updated": "2013-12-18T21:29:16.874Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.289Z", 
-        "amount": 0.1848, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.698Z", 
+        "amount": 0.3248, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.64, 
-        "invoice": 54, 
-        "date": "2013-11-16T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 64, 
+        "date": "2013-11-22T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59680
+    "pk": 61482
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.415Z", 
+        "updated": "2013-12-18T21:29:16.916Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.297Z", 
-        "amount": 0.2912, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.707Z", 
+        "amount": 0.2072, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 54, 
-        "date": "2013-11-16T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 64, 
+        "date": "2013-11-22T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59681
+    "pk": 61483
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.457Z", 
+        "updated": "2013-12-18T21:29:16.957Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.305Z", 
-        "amount": 0.2128
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.715Z", 
+        "amount": 0.1736
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 54, 
-        "date": "2013-11-17T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 64, 
+        "date": "2013-11-22T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59682
+    "pk": 61484
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.498Z", 
+        "updated": "2013-12-18T21:29:16.999Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.314Z", 
-        "amount": 0.1624, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.723Z", 
+        "amount": 0.1904, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 54, 
-        "date": "2013-11-17T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.72, 
+        "invoice": 64, 
+        "date": "2013-11-23T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59683
+    "pk": 61485
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.539Z", 
+        "updated": "2013-12-18T21:29:17.040Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.322Z", 
-        "amount": 0.2352
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.731Z", 
+        "amount": 0.2744
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 54, 
-        "date": "2013-11-17T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 64, 
+        "date": "2013-11-23T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59684
+    "pk": 61486
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.614Z", 
+        "updated": "2013-12-18T21:29:17.081Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.330Z", 
-        "amount": 0.1512
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.740Z", 
+        "amount": 0.2184
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.16, 
-        "invoice": 55, 
-        "date": "2013-11-18T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 64, 
+        "date": "2013-11-23T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59685
+    "pk": 61487
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.655Z", 
+        "updated": "2013-12-18T21:29:17.123Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.339Z", 
-        "amount": 0.112, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.748Z", 
+        "amount": 0.2912, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 55, 
-        "date": "2013-11-18T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 64, 
+        "date": "2013-11-24T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59686
+    "pk": 61488
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.697Z", 
+        "updated": "2013-12-18T21:29:17.164Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.347Z", 
-        "amount": 0.3024
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.756Z", 
+        "amount": 0.3136
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.32, 
-        "invoice": 55, 
-        "date": "2013-11-18T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 64, 
+        "date": "2013-11-24T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59687
+    "pk": 61489
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.738Z", 
+        "updated": "2013-12-18T21:29:17.206Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.355Z", 
-        "amount": 0.2744
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.765Z", 
+        "amount": 0.168
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 55, 
-        "date": "2013-11-19T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.4, 
+        "invoice": 64, 
+        "date": "2013-11-24T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59688
+    "pk": 61490
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.780Z", 
+        "updated": "2013-12-18T21:29:17.278Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.363Z", 
-        "amount": 0.196
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.773Z", 
+        "amount": 0.224
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-19T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 65, 
+        "date": "2013-11-25T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59689
+    "pk": 61491
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.821Z", 
+        "updated": "2013-12-18T21:29:17.336Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.371Z", 
+        "created": "2013-12-18T21:29:15.781Z", 
         "amount": 0.2856, 
-        "object": 103
-        "account": 12
+        "object": 121
+        "account": 14
         "state": "invoiced", 
         "coreHours": 4.08, 
-        "invoice": 55, 
-        "date": "2013-11-19T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 65, 
+        "date": "2013-11-25T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59690
+    "pk": 61492
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.863Z", 
+        "updated": "2013-12-18T21:29:17.377Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.380Z", 
-        "amount": 0.28
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.789Z", 
+        "amount": 0.336
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 55, 
-        "date": "2013-11-20T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.8, 
+        "invoice": 65, 
+        "date": "2013-11-25T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59691
+    "pk": 61493
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.904Z", 
+        "updated": "2013-12-18T21:29:17.419Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.388Z", 
-        "amount": 0.2576, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.798Z", 
+        "amount": 0.1736, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.68, 
-        "invoice": 55, 
-        "date": "2013-11-20T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.48, 
+        "invoice": 65, 
+        "date": "2013-11-26T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59692
+    "pk": 61494
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.945Z", 
+        "updated": "2013-12-18T21:29:17.460Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.396Z", 
-        "amount": 0.112, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.806Z", 
+        "amount": 0.1792, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 55, 
-        "date": "2013-11-20T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 65, 
+        "date": "2013-11-26T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59693
+    "pk": 61495
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:55.987Z", 
+        "updated": "2013-12-18T21:29:17.501Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.405Z", 
-        "amount": 0.3248, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.814Z", 
+        "amount": 0.1288, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 55, 
-        "date": "2013-11-21T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.84, 
+        "invoice": 65, 
+        "date": "2013-11-26T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59694
+    "pk": 61496
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.028Z", 
+        "updated": "2013-12-18T21:29:17.618Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.413Z", 
-        "amount": 0.2352
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.822Z", 
+        "amount": 0.2744
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 55, 
-        "date": "2013-11-21T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.92, 
+        "invoice": 65, 
+        "date": "2013-11-27T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59695
+    "pk": 61497
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.070Z", 
+        "updated": "2013-12-18T21:29:17.659Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.421Z", 
-        "amount": 0.1904
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.831Z", 
+        "amount": 0.196
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.72, 
-        "invoice": 55, 
-        "date": "2013-11-21T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 65, 
+        "date": "2013-11-27T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59696
+    "pk": 61498
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.111Z", 
+        "updated": "2013-12-18T21:29:17.700Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.429Z", 
-        "amount": 0.2408
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.839Z", 
+        "amount": 0.2296
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 55, 
-        "date": "2013-11-22T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 65, 
+        "date": "2013-11-27T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59697
+    "pk": 61499
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.153Z", 
+        "updated": "2013-12-18T21:29:17.742Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.438Z", 
+        "created": "2013-12-18T21:29:15.847Z", 
         "amount": 0.1288, 
-        "object": 103
-        "account": 12
+        "object": 121
+        "account": 14
         "state": "invoiced", 
         "coreHours": 1.84, 
-        "invoice": 55, 
-        "date": "2013-11-22T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 65, 
+        "date": "2013-11-28T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59698
+    "pk": 61500
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.194Z", 
+        "updated": "2013-12-18T21:29:17.783Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.446Z", 
-        "amount": 0.2968
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.856Z", 
+        "amount": 0.2912
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 55, 
-        "date": "2013-11-22T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 65, 
+        "date": "2013-11-28T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59699
+    "pk": 61501
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.235Z", 
+        "updated": "2013-12-18T21:29:17.824Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.454Z", 
+        "created": "2013-12-18T21:29:15.864Z", 
         "amount": 0.2464, 
-        "object": 103
-        "account": 12
+        "object": 121
+        "account": 14
         "state": "invoiced", 
         "coreHours": 3.52, 
-        "invoice": 55, 
-        "date": "2013-11-23T06:00:00Z", 
-        "kind": "besteffort"
-    }
-},
-{
-    "pk": 59700, 
-    "model": "core.charge", 
-    "fields": {
-        "updated": "2013-12-13T22:19:56.277Z", 
-        "slice": 15, 
-        "created": "2013-12-13T22:19:54.463Z", 
-        "amount": 0.196, 
-        "object": 103, 
-        "account": 12, 
-        "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 55, 
-        "date": "2013-11-23T14:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 65, 
+        "date": "2013-11-28T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59701
+    "pk": 61502
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.318Z", 
+        "updated": "2013-12-18T21:29:17.866Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.471Z", 
-        "amount": 0.28
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.872Z", 
+        "amount": 0.224
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 55, 
-        "date": "2013-11-23T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 65, 
+        "date": "2013-11-29T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59702
+    "pk": 61503
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.360Z", 
+        "updated": "2013-12-18T21:29:17.907Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.479Z", 
-        "amount": 0.2016
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.880Z", 
+        "amount": 0.2408
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 55, 
-        "date": "2013-11-24T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 65, 
+        "date": "2013-11-29T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59703
+    "pk": 61504
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.401Z", 
+        "updated": "2013-12-18T21:29:17.949Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.487Z", 
-        "amount": 0.1792
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.889Z", 
+        "amount": 0.1456
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 55, 
-        "date": "2013-11-24T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 65, 
+        "date": "2013-11-29T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59704
+    "pk": 61505
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.442Z", 
+        "updated": "2013-12-18T21:29:17.990Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.496Z", 
-        "amount": 0.2128, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.897Z", 
+        "amount": 0.1848, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 55, 
-        "date": "2013-11-24T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 65, 
+        "date": "2013-11-30T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59705
+    "pk": 61506
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.492Z", 
+        "updated": "2013-12-18T21:29:18.032Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.504Z", 
-        "amount": 0.2016, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.905Z", 
+        "amount": 0.2576, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.88, 
-        "invoice": 56, 
-        "date": "2013-11-25T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.68, 
+        "invoice": 65, 
+        "date": "2013-11-30T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59706
+    "pk": 61507
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.534Z", 
+        "updated": "2013-12-18T21:29:18.073Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.512Z", 
-        "amount": 0.1456
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.914Z", 
+        "amount": 0.2128
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 56, 
-        "date": "2013-11-25T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.04, 
+        "invoice": 65, 
+        "date": "2013-11-30T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59707
+    "pk": 61508
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.575Z", 
+        "updated": "2013-12-18T21:29:18.114Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.521Z", 
-        "amount": 0.2688, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.922Z", 
+        "amount": 0.3248, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 56, 
-        "date": "2013-11-25T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 65, 
+        "date": "2013-12-01T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59708
+    "pk": 61509
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.616Z", 
+        "updated": "2013-12-18T21:29:18.156Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.529Z", 
-        "amount": 0.336
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.930Z", 
+        "amount": 0.224
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 56, 
-        "date": "2013-11-26T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 65, 
+        "date": "2013-12-01T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59709
+    "pk": 61510
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.659Z", 
+        "updated": "2013-12-18T21:29:18.197Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.537Z", 
-        "amount": 0.112
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.938Z", 
+        "amount": 0.3136
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-26T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 65, 
+        "date": "2013-12-01T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59710
+    "pk": 61511
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.701Z", 
+        "updated": "2013-12-18T21:29:18.247Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.545Z", 
-        "amount": 0.2968
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.947Z", 
+        "amount": 0.2912
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.24, 
-        "invoice": 56, 
-        "date": "2013-11-26T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.16, 
+        "invoice": 66, 
+        "date": "2013-12-02T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59711
+    "pk": 61512
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.742Z", 
+        "updated": "2013-12-18T21:29:18.288Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.554Z", 
-        "amount": 0.1232, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.955Z", 
+        "amount": 0.252, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.76, 
-        "invoice": 56, 
-        "date": "2013-11-27T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 66, 
+        "date": "2013-12-02T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59712
+    "pk": 61513
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.784Z", 
+        "updated": "2013-12-18T21:29:18.330Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.562Z", 
-        "amount": 0.3192
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.963Z", 
+        "amount": 0.2968
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 56, 
-        "date": "2013-11-27T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 66, 
+        "date": "2013-12-02T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59713
+    "pk": 61514
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.825Z", 
+        "updated": "2013-12-18T21:29:18.371Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.570Z", 
-        "amount": 0.2072
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.972Z", 
+        "amount": 0.1568
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 56, 
-        "date": "2013-11-27T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 66, 
+        "date": "2013-12-03T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59714
+    "pk": 61515
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.867Z", 
+        "updated": "2013-12-18T21:29:18.413Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.579Z", 
-        "amount": 0.1624, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.980Z", 
+        "amount": 0.3024, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.32, 
-        "invoice": 56, 
-        "date": "2013-11-28T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 66, 
+        "date": "2013-12-03T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59715
+    "pk": 61516
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.908Z", 
+        "updated": "2013-12-18T21:29:18.454Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.587Z", 
-        "amount": 0.1456, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.988Z", 
+        "amount": 0.196, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.08, 
-        "invoice": 56, 
-        "date": "2013-11-28T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.8, 
+        "invoice": 66, 
+        "date": "2013-12-03T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59716
+    "pk": 61517
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.949Z", 
+        "updated": "2013-12-18T21:29:18.496Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.595Z", 
-        "amount": 0.112
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:15.997Z", 
+        "amount": 0.2968
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.6, 
-        "invoice": 56, 
-        "date": "2013-11-28T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.24, 
+        "invoice": 66, 
+        "date": "2013-12-04T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59717
+    "pk": 61518
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:56.991Z", 
+        "updated": "2013-12-18T21:29:18.537Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.603Z", 
-        "amount": 0.2688
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.005Z", 
+        "amount": 0.3304
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.84, 
-        "invoice": 56, 
-        "date": "2013-11-29T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 66, 
+        "date": "2013-12-04T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59718
+    "pk": 61519
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.032Z", 
+        "updated": "2013-12-18T21:29:18.578Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.612Z", 
-        "amount": 0.14
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.013Z", 
+        "amount": 0.1848
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.0, 
-        "invoice": 56, 
-        "date": "2013-11-29T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 66, 
+        "date": "2013-12-04T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59719
+    "pk": 61520
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.074Z", 
+        "updated": "2013-12-18T21:29:18.620Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.620Z", 
-        "amount": 0.1288, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.021Z", 
+        "amount": 0.2408, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 1.84, 
-        "invoice": 56, 
-        "date": "2013-11-29T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.44, 
+        "invoice": 66, 
+        "date": "2013-12-05T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59720
+    "pk": 61521
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.148Z", 
+        "updated": "2013-12-18T21:29:18.661Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.628Z", 
-        "amount": 0.1736
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.030Z", 
+        "amount": 0.2464
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.48, 
-        "invoice": 56, 
-        "date": "2013-11-30T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.52, 
+        "invoice": 66, 
+        "date": "2013-12-05T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59721
+    "pk": 61522
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.190Z", 
+        "updated": "2013-12-18T21:29:18.703Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.637Z", 
-        "amount": 0.2464
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.038Z", 
+        "amount": 0.28
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 56, 
-        "date": "2013-11-30T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 66, 
+        "date": "2013-12-05T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59722
+    "pk": 61523
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.231Z", 
+        "updated": "2013-12-18T21:29:18.744Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.645Z", 
-        "amount": 0.2184
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.046Z", 
+        "amount": 0.1848
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.12, 
-        "invoice": 56, 
-        "date": "2013-11-30T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.64, 
+        "invoice": 66, 
+        "date": "2013-12-06T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59723
+    "pk": 61524
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.272Z", 
+        "updated": "2013-12-18T21:29:18.785Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.653Z", 
-        "amount": 0.2744
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.054Z", 
+        "amount": 0.308
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 56, 
-        "date": "2013-12-01T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 66, 
+        "date": "2013-12-06T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59724
+    "pk": 61525
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.314Z", 
+        "updated": "2013-12-18T21:29:18.827Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.661Z", 
-        "amount": 0.2744
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.063Z", 
+        "amount": 0.3248
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 56, 
-        "date": "2013-12-01T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.64, 
+        "invoice": 66, 
+        "date": "2013-12-06T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59725
+    "pk": 61526
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.355Z", 
+        "updated": "2013-12-18T21:29:18.868Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.670Z", 
-        "amount": 0.2352, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.071Z", 
+        "amount": 0.112, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 56, 
-        "date": "2013-12-01T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.6, 
+        "invoice": 66, 
+        "date": "2013-12-07T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59726
+    "pk": 61527
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.405Z", 
+        "updated": "2013-12-18T21:29:18.910Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.678Z", 
-        "amount": 0.2744
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.079Z", 
+        "amount": 0.252
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.92, 
-        "invoice": 57, 
-        "date": "2013-12-02T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.6, 
+        "invoice": 66, 
+        "date": "2013-12-07T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59727
+    "pk": 61528
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.446Z", 
+        "updated": "2013-12-18T21:29:18.951Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.686Z", 
-        "amount": 0.3192
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.088Z", 
+        "amount": 0.308
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.56, 
-        "invoice": 57, 
-        "date": "2013-12-02T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 66, 
+        "date": "2013-12-07T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59728
+    "pk": 61529
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.488Z", 
+        "updated": "2013-12-18T21:29:18.993Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.695Z", 
-        "amount": 0.28
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.096Z", 
+        "amount": 0.3304
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.0, 
-        "invoice": 57, 
-        "date": "2013-12-02T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.72, 
+        "invoice": 66, 
+        "date": "2013-12-08T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59729
+    "pk": 61530
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.529Z", 
+        "updated": "2013-12-18T21:29:19.034Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.703Z", 
-        "amount": 0.2912
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.104Z", 
+        "amount": 0.2296
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.16, 
-        "invoice": 57, 
-        "date": "2013-12-03T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.28, 
+        "invoice": 66, 
+        "date": "2013-12-08T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59730
+    "pk": 61531
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.571Z", 
+        "updated": "2013-12-18T21:29:19.075Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.711Z", 
-        "amount": 0.252
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.112Z", 
+        "amount": 0.3024
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 57, 
-        "date": "2013-12-03T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.32, 
+        "invoice": 66, 
+        "date": "2013-12-08T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59731
+    "pk": 61532
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.612Z", 
+        "updated": "2013-12-18T21:29:19.125Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.719Z", 
-        "amount": 0.1792
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.121Z", 
+        "amount": 0.1456
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.56, 
-        "invoice": 57, 
-        "date": "2013-12-03T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-09T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59732
+    "pk": 61533
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.653Z", 
+        "updated": "2013-12-18T21:29:19.167Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.728Z", 
-        "amount": 0.2408
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.129Z", 
+        "amount": 0.1456
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 57, 
-        "date": "2013-12-04T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-09T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59733
+    "pk": 61534
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.695Z", 
+        "updated": "2013-12-18T21:29:19.208Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.736Z", 
-        "amount": 0.2352
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.137Z", 
+        "amount": 0.2184
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 57, 
-        "date": "2013-12-04T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-09T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59734
+    "pk": 61535
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.736Z", 
+        "updated": "2013-12-18T21:29:19.249Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.744Z", 
-        "amount": 0.3248
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.146Z", 
+        "amount": 0.2184
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.64, 
-        "invoice": 57, 
-        "date": "2013-12-04T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.12, 
+        "invoice": 67, 
+        "date": "2013-12-10T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59735
+    "pk": 61536
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.778Z", 
+        "updated": "2013-12-18T21:29:19.291Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.753Z", 
-        "amount": 0.2408
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.154Z", 
+        "amount": 0.1624
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 57, 
-        "date": "2013-12-05T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.32, 
+        "invoice": 67, 
+        "date": "2013-12-10T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59736
+    "pk": 61537
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.819Z", 
+        "updated": "2013-12-18T21:29:19.332Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.761Z", 
-        "amount": 0.224
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.162Z", 
+        "amount": 0.308
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.2, 
-        "invoice": 57, 
-        "date": "2013-12-05T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.4, 
+        "invoice": 67, 
+        "date": "2013-12-10T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59737
+    "pk": 61538
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.861Z", 
+        "updated": "2013-12-18T21:29:19.374Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.769Z", 
-        "amount": 0.2128, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.170Z", 
+        "amount": 0.1568, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.04, 
-        "invoice": 57, 
-        "date": "2013-12-05T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.24, 
+        "invoice": 67, 
+        "date": "2013-12-11T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59738
+    "pk": 61539
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.902Z", 
+        "updated": "2013-12-18T21:29:19.415Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.777Z", 
-        "amount": 0.2072
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.179Z", 
+        "amount": 0.2856
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.96, 
-        "invoice": 57, 
-        "date": "2013-12-06T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.08, 
+        "invoice": 67, 
+        "date": "2013-12-11T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59739
+    "pk": 61540
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.943Z", 
+        "updated": "2013-12-18T21:29:19.457Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.786Z", 
-        "amount": 0.252
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.187Z", 
+        "amount": 0.3136
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.6, 
-        "invoice": 57, 
-        "date": "2013-12-06T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.48, 
+        "invoice": 67, 
+        "date": "2013-12-11T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59740
+    "pk": 61541
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:57.985Z", 
+        "updated": "2013-12-18T21:29:19.498Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.794Z", 
+        "created": "2013-12-18T21:29:16.195Z", 
         "amount": 0.224, 
-        "object": 103
-        "account": 12
+        "object": 121
+        "account": 14
         "state": "invoiced", 
         "coreHours": 3.2, 
-        "invoice": 57, 
-        "date": "2013-12-06T22:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 67, 
+        "date": "2013-12-12T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59741
+    "pk": 61542
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.026Z", 
+        "updated": "2013-12-18T21:29:19.539Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.802Z", 
-        "amount": 0.196
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.204Z", 
+        "amount": 0.2688
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 2.8, 
-        "invoice": 57, 
-        "date": "2013-12-07T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.84, 
+        "invoice": 67, 
+        "date": "2013-12-12T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59742
+    "pk": 61543
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.068Z", 
+        "updated": "2013-12-18T21:29:19.581Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.811Z", 
-        "amount": 0.2352
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.212Z", 
+        "amount": 0.224
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.36, 
-        "invoice": 57, 
-        "date": "2013-12-07T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 3.2, 
+        "invoice": 67, 
+        "date": "2013-12-12T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59743
+    "pk": 61544
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.109Z", 
+        "updated": "2013-12-18T21:29:19.622Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.819Z", 
-        "amount": 0.2408, 
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.220Z", 
+        "amount": 0.28, 
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.44, 
-        "invoice": 57, 
-        "date": "2013-12-07T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 4.0, 
+        "invoice": 67, 
+        "date": "2013-12-13T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59744
+    "pk": 61545
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.151Z", 
+        "updated": "2013-12-18T21:29:19.664Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.827Z", 
-        "amount": 0.3304
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.228Z", 
+        "amount": 0.1792
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.72, 
-        "invoice": 57, 
-        "date": "2013-12-08T06:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.56, 
+        "invoice": 67, 
+        "date": "2013-12-13T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59745
+    "pk": 61546
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.192Z", 
+        "updated": "2013-12-18T21:29:19.705Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.835Z", 
-        "amount": 0.336
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.237Z", 
+        "amount": 0.1344
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 4.8, 
-        "invoice": 57, 
-        "date": "2013-12-08T14:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 1.92, 
+        "invoice": 67, 
+        "date": "2013-12-13T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59746
+    "pk": 61547
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:58.233Z", 
+        "updated": "2013-12-18T21:29:19.746Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.844Z", 
-        "amount": 0.2464
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.245Z", 
+        "amount": 0.2072
+        "object": 121
+        "account": 14
         "state": "invoiced", 
-        "coreHours": 3.52, 
-        "invoice": 57, 
-        "date": "2013-12-08T22:00:00Z", 
-        "kind": "besteffort"
+        "coreHours": 2.96, 
+        "invoice": 67, 
+        "date": "2013-12-14T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59747
+    "pk": 61548
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.852Z", 
+        "updated": "2013-12-18T21:29:19.788Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.852Z", 
+        "created": "2013-12-18T21:29:16.253Z", 
         "amount": 0.252, 
-        "object": 103
-        "account": 12
-        "state": "pending", 
+        "object": 121
+        "account": 14
+        "state": "invoiced", 
         "coreHours": 3.6, 
-        "invoice": null, 
-        "date": "2013-12-09T06:00:00Z", 
-        "kind": "besteffort"
+        "invoice": 67, 
+        "date": "2013-12-14T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59748
+    "pk": 61549
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.860Z", 
+        "updated": "2013-12-18T21:29:19.837Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.860Z", 
-        "amount": 0.3304, 
-        "object": 103, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.72, 
-        "invoice": null, 
-        "date": "2013-12-09T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:16.262Z", 
+        "amount": 0.2296, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 3.28, 
+        "invoice": 67, 
+        "date": "2013-12-14T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59749
+    "pk": 61550
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.869Z", 
+        "updated": "2013-12-18T21:29:19.879Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.869Z", 
-        "amount": 0.1344, 
-        "object": 103, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 1.92, 
-        "invoice": null, 
-        "date": "2013-12-09T22:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:16.270Z", 
+        "amount": 0.1456, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.08, 
+        "invoice": 67, 
+        "date": "2013-12-15T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59750
+    "pk": 61551
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.877Z", 
+        "updated": "2013-12-18T21:29:19.920Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.877Z", 
-        "amount": 0.224, 
-        "object": 103, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 3.2, 
-        "invoice": null, 
-        "date": "2013-12-10T06:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:16.278Z", 
+        "amount": 0.3304, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 4.72, 
+        "invoice": 67, 
+        "date": "2013-12-15T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59751
+    "pk": 61552
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.885Z", 
+        "updated": "2013-12-18T21:29:19.962Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.885Z", 
-        "amount": 0.1232, 
-        "object": 103, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 1.76, 
-        "invoice": null, 
-        "date": "2013-12-10T14:00:00Z", 
-        "kind": "besteffort"
+        "created": "2013-12-18T21:29:16.286Z", 
+        "amount": 0.2016, 
+        "object": 121, 
+        "account": 14, 
+        "state": "invoiced", 
+        "coreHours": 2.88, 
+        "invoice": 67, 
+        "date": "2013-12-15T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59752
+    "pk": 61553
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.894Z", 
+        "updated": "2013-12-18T21:29:16.295Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.893Z", 
-        "amount": 0.3304
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.295Z", 
+        "amount": 0.2128
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 4.72
+        "coreHours": 3.04
         "invoice": null, 
-        "date": "2013-12-10T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59753
+    "pk": 61554
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.902Z", 
+        "updated": "2013-12-18T21:29:16.303Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.902Z", 
-        "amount": 0.1736
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.303Z", 
+        "amount": 0.3192
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 2.48
+        "coreHours": 4.56
         "invoice": null, 
-        "date": "2013-12-11T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59754
+    "pk": 61555
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.910Z", 
+        "updated": "2013-12-18T21:29:16.311Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.910Z", 
-        "amount": 0.28
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.311Z", 
+        "amount": 0.1232
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 4.0
+        "coreHours": 1.76
         "invoice": null, 
-        "date": "2013-12-11T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-16T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59755
+    "pk": 61556
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.918Z", 
+        "updated": "2013-12-18T21:29:16.320Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.918Z", 
-        "amount": 0.2464
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.320Z", 
+        "amount": 0.1736
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 3.52
+        "coreHours": 2.48
         "invoice": null, 
-        "date": "2013-12-11T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59756
+    "pk": 61557
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.927Z", 
+        "updated": "2013-12-18T21:29:16.328Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.927Z", 
-        "amount": 0.1288
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.328Z", 
+        "amount": 0.1792
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 1.84
+        "coreHours": 2.56
         "invoice": null, 
-        "date": "2013-12-12T06:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59757
+    "pk": 61558
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.935Z", 
+        "updated": "2013-12-18T21:29:16.336Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.935Z", 
-        "amount": 0.168
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.336Z", 
+        "amount": 0.112
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 2.4
+        "coreHours": 1.6
         "invoice": null, 
-        "date": "2013-12-12T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-17T21:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59758
+    "pk": 61559
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.943Z", 
+        "updated": "2013-12-18T21:29:16.344Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.943Z", 
-        "amount": 0.1512
-        "object": 103
-        "account": 12
+        "created": "2013-12-18T21:29:16.344Z", 
+        "amount": 0.196
+        "object": 121
+        "account": 14
         "state": "pending", 
-        "coreHours": 2.16
+        "coreHours": 2.8
         "invoice": null, 
-        "date": "2013-12-12T22:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T05:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
-    "pk": 59759
+    "pk": 61560
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-13T22:19:54.951Z", 
+        "updated": "2013-12-18T21:29:16.353Z", 
         "slice": 15, 
-        "created": "2013-12-13T22:19:54.951Z", 
+        "created": "2013-12-18T21:29:16.353Z", 
         "amount": 0.252, 
-        "object": 103
-        "account": 12
+        "object": 121
+        "account": 14
         "state": "pending", 
         "coreHours": 3.6, 
         "invoice": null, 
-        "date": "2013-12-13T06:00:00Z", 
-        "kind": "besteffort"
-    }
-},
-{
-    "pk": 59760, 
-    "model": "core.charge", 
-    "fields": {
-        "updated": "2013-12-13T22:19:54.960Z", 
-        "slice": 15, 
-        "created": "2013-12-13T22:19:54.960Z", 
-        "amount": 0.336, 
-        "object": 103, 
-        "account": 12, 
-        "state": "pending", 
-        "coreHours": 4.8, 
-        "invoice": null, 
-        "date": "2013-12-13T14:00:00Z", 
-        "kind": "besteffort"
+        "date": "2013-12-18T13:00:00Z", 
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-11T18:11:43.757Z", 
         "description": "", 
+        "created": "2013-12-11T18:11:43.757Z", 
         "enabled": true, 
+        "service_provider_id": null, 
         "name": "internet2", 
-        "created": "2013-12-11T18:11:43.757Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-11T18:13:38.024Z", 
         "description": "", 
+        "created": "2013-12-11T18:11:52.622Z", 
         "enabled": true, 
+        "service_provider_id": null, 
         "name": "Syndicate", 
-        "created": "2013-12-11T18:11:52.622Z"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:17.472Z", 
-        "description": "Peer-to-peer content sharing for Syndicate distributed filesystem", 
+        "name": "Syndicate", 
         "created": "2013-12-11T23:57:17.472Z", 
+        "content_provider_id": null, 
         "serviceProvider": 2, 
+        "description": "Peer-to-peer content sharing for Syndicate distributed filesystem", 
         "enabled": true, 
         "users": [], 
-        "name": "Syndicate"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.586Z", 
-        "description": "Content Provider for Georgia Tech", 
+        "name": "Georgia Tech", 
         "created": "2013-12-11T23:57:20.586Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Georgia Tech", 
         "enabled": true, 
         "users": [], 
-        "name": "Georgia Tech"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.611Z", 
-        "description": "Content Provider for Stanford University", 
+        "name": "Stanford University", 
         "created": "2013-12-11T23:57:20.611Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Stanford University", 
         "enabled": true, 
         "users": [], 
-        "name": "Stanford University"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.636Z", 
-        "description": "Content Provider for University of Washington", 
+        "name": "University of Washington", 
         "created": "2013-12-11T23:57:20.636Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for University of Washington", 
         "enabled": true, 
         "users": [], 
-        "name": "University of Washington"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.660Z", 
-        "description": "Content Provider for Max Planck Institute", 
+        "name": "Max Planck Institute", 
         "created": "2013-12-11T23:57:20.660Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Max Planck Institute", 
         "enabled": true, 
         "users": [], 
-        "name": "Max Planck Institute"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.685Z", 
-        "description": "Content Provider for Princeton University", 
+        "name": "Princeton University", 
         "created": "2013-12-11T23:57:20.685Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Princeton University", 
         "enabled": true, 
         "users": [], 
-        "name": "Princeton University"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.710Z", 
-        "description": "Open Networking Lab", 
+        "name": "ON.LAB", 
         "created": "2013-12-11T23:57:20.710Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Open Networking Lab", 
         "enabled": true, 
         "users": [], 
-        "name": "ON.LAB"
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.496Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.496Z", 
         "url": "node70.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.503Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.503Z", 
         "url": "node69.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.512Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.512Z", 
         "url": "node68.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.520Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.520Z", 
         "url": "node67.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.528Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.528Z", 
         "url": "node66.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.537Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.537Z", 
         "url": "node65.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.545Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.545Z", 
         "url": "node64.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.553Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.553Z", 
         "url": "node63.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.561Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.561Z", 
         "url": "node62.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.570Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.570Z", 
         "url": "node61.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.578Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.578Z", 
         "url": "node60.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.586Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.586Z", 
         "url": "node59.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.595Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.595Z", 
         "url": "node58.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.603Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.603Z", 
         "url": "node57.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.611Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.611Z", 
         "url": "node56.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.619Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.619Z", 
         "url": "node55.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.628Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.628Z", 
         "url": "node54.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.636Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.636Z", 
         "url": "node53.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.644Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.644Z", 
         "url": "node52.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.653Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.653Z", 
         "url": "node51.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.661Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.661Z", 
         "url": "node50.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.669Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.669Z", 
         "url": "node49.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.677Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.677Z", 
         "url": "node48.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.686Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.686Z", 
         "url": "node47.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.694Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.694Z", 
         "url": "node46.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.702Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.702Z", 
         "url": "node45.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.711Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.711Z", 
         "url": "node44.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.719Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.719Z", 
         "url": "node43.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.727Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.727Z", 
         "url": "node42.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.735Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.735Z", 
         "url": "node41.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.744Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.744Z", 
         "url": "node40.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.752Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.752Z", 
         "url": "node39.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.760Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.760Z", 
         "url": "node38.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.768Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.768Z", 
         "url": "node37.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.777Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.777Z", 
         "url": "node36.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.785Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.785Z", 
         "url": "node35.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.793Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.793Z", 
         "url": "node34.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.802Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.802Z", 
         "url": "node33.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.810Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.810Z", 
         "url": "node32.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.818Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.818Z", 
         "url": "node31.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.826Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.826Z", 
         "url": "node30.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.835Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.835Z", 
         "url": "node29.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.843Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.843Z", 
         "url": "node28.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.851Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.851Z", 
         "url": "node27.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.860Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.860Z", 
         "url": "node26.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.868Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.868Z", 
         "url": "node25.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.876Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.876Z", 
         "url": "node24.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.884Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.884Z", 
         "url": "node23.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.893Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.893Z", 
         "url": "node22.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.901Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.901Z", 
         "url": "node21.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.909Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.909Z", 
         "url": "node20.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.918Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.918Z", 
         "url": "node19.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.926Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.926Z", 
         "url": "node18.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.934Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.934Z", 
         "url": "node17.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.942Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.942Z", 
         "url": "node16.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.951Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.951Z", 
         "url": "node15.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.959Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.959Z", 
         "url": "node14.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.967Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.967Z", 
         "url": "node13.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.975Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.975Z", 
         "url": "node12.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.984Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.984Z", 
         "url": "node11.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.992Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.992Z", 
         "url": "node10.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18Z", 
         "url": "node9.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.009Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.009Z", 
         "url": "node8.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.017Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.017Z", 
         "url": "node7.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.025Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.025Z", 
         "url": "node6.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.034Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.034Z", 
         "url": "node5.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.042Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.042Z", 
         "url": "node4.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.050Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.050Z", 
         "url": "node3.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.058Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.058Z", 
         "url": "node2.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.067Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.067Z", 
         "url": "node1.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.084Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.084Z", 
         "url": "node70.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.092Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.092Z", 
         "url": "node69.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.100Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.100Z", 
         "url": "node68.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.108Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.108Z", 
         "url": "node67.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.116Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.116Z", 
         "url": "node66.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.125Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.125Z", 
         "url": "node65.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.133Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.133Z", 
         "url": "node64.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.141Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.141Z", 
         "url": "node63.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.149Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.149Z", 
         "url": "node62.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.158Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.158Z", 
         "url": "node61.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.166Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.166Z", 
         "url": "node60.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.174Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.174Z", 
         "url": "node59.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.183Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.183Z", 
         "url": "node58.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.191Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.191Z", 
         "url": "node57.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.199Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.199Z", 
         "url": "node56.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.208Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.207Z", 
         "url": "node55.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.216Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.216Z", 
         "url": "node54.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.224Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.224Z", 
         "url": "node53.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.238Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.238Z", 
         "url": "node52.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.286Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.286Z", 
         "url": "node51.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.299Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.298Z", 
         "url": "node50.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.307Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.307Z", 
         "url": "node49.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.315Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.315Z", 
         "url": "node48.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.323Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.323Z", 
         "url": "node47.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.332Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.332Z", 
         "url": "node46.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.340Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.340Z", 
         "url": "node45.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.348Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.348Z", 
         "url": "node44.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.357Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.356Z", 
         "url": "node43.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.365Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.365Z", 
         "url": "node42.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.373Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.373Z", 
         "url": "node41.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.381Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.381Z", 
         "url": "node40.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.390Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.390Z", 
         "url": "node39.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.398Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.398Z", 
         "url": "node38.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.406Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.406Z", 
         "url": "node37.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.414Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.414Z", 
         "url": "node36.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.423Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.423Z", 
         "url": "node35.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.431Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.431Z", 
         "url": "node34.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.439Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.439Z", 
         "url": "node33.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.448Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.448Z", 
         "url": "node32.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.456Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.456Z", 
         "url": "node31.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.464Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.464Z", 
         "url": "node30.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.472Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.472Z", 
         "url": "node29.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.481Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.481Z", 
         "url": "node28.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.489Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.489Z", 
         "url": "node27.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.497Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.497Z", 
         "url": "node26.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.506Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.505Z", 
         "url": "node25.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.514Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.514Z", 
         "url": "node24.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.522Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.522Z", 
         "url": "node23.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.530Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.530Z", 
         "url": "node22.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.539Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.539Z", 
         "url": "node21.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.547Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.547Z", 
         "url": "node20.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.555Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.555Z", 
         "url": "node19.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.564Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.563Z", 
         "url": "node18.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.572Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.572Z", 
         "url": "node17.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.580Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.580Z", 
         "url": "node16.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.588Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.588Z", 
         "url": "node15.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.597Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.597Z", 
         "url": "node14.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.605Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.605Z", 
         "url": "node13.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.613Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.613Z", 
         "url": "node12.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.622Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.622Z", 
         "url": "node11.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.630Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.630Z", 
         "url": "node10.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.638Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.638Z", 
         "url": "node9.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.646Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.646Z", 
         "url": "node8.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.655Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.655Z", 
         "url": "node7.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.663Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.663Z", 
         "url": "node6.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.671Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.671Z", 
         "url": "node5.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.680Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.680Z", 
         "url": "node4.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.688Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.688Z", 
         "url": "node3.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.696Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.696Z", 
         "url": "node2.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.704Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.704Z", 
         "url": "node1.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.722Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.722Z", 
         "url": "node70.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.729Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.729Z", 
         "url": "node69.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.738Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.737Z", 
         "url": "node68.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.746Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.746Z", 
         "url": "node67.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.754Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.754Z", 
         "url": "node66.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.762Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.762Z", 
         "url": "node65.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.771Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.771Z", 
         "url": "node64.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.779Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.779Z", 
         "url": "node63.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.787Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.787Z", 
         "url": "node62.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.795Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.795Z", 
         "url": "node61.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.804Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.804Z", 
         "url": "node60.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.812Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.812Z", 
         "url": "node59.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.820Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.820Z", 
         "url": "node58.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.829Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.829Z", 
         "url": "node57.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.837Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.837Z", 
         "url": "node56.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.845Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.845Z", 
         "url": "node55.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.853Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.853Z", 
         "url": "node54.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.862Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.862Z", 
         "url": "node53.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.870Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.870Z", 
         "url": "node52.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.878Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.878Z", 
         "url": "node51.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.887Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.887Z", 
         "url": "node50.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.895Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.895Z", 
         "url": "node49.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.903Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.903Z", 
         "url": "node48.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.911Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.911Z", 
         "url": "node47.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.920Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.920Z", 
         "url": "node46.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.928Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.928Z", 
         "url": "node45.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.936Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.936Z", 
         "url": "node44.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.944Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.944Z", 
         "url": "node43.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.953Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.953Z", 
         "url": "node42.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.961Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.961Z", 
         "url": "node41.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.969Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.969Z", 
         "url": "node40.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.978Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.978Z", 
         "url": "node39.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.986Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.986Z", 
         "url": "node38.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.994Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.994Z", 
         "url": "node37.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.002Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.002Z", 
         "url": "node36.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.011Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.011Z", 
         "url": "node35.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.019Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.019Z", 
         "url": "node34.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.027Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.027Z", 
         "url": "node33.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.036Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.036Z", 
         "url": "node32.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.044Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.044Z", 
         "url": "node31.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.052Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.052Z", 
         "url": "node30.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.060Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.060Z", 
         "url": "node29.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.069Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.069Z", 
         "url": "node28.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.077Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.077Z", 
         "url": "node27.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.086Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.085Z", 
         "url": "node26.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.094Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.094Z", 
         "url": "node25.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.102Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.102Z", 
         "url": "node24.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.110Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.110Z", 
         "url": "node23.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.118Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.118Z", 
         "url": "node22.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.127Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.127Z", 
         "url": "node21.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.135Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.135Z", 
         "url": "node20.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.143Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.143Z", 
         "url": "node19.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.152Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.152Z", 
         "url": "node18.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.160Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.160Z", 
         "url": "node17.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.168Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.168Z", 
         "url": "node16.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.176Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.176Z", 
         "url": "node15.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.185Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.185Z", 
         "url": "node14.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.193Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.193Z", 
         "url": "node13.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.201Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.201Z", 
         "url": "node12.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.210Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.210Z", 
         "url": "node11.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.218Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.218Z", 
         "url": "node10.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.226Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.226Z", 
         "url": "node9.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.234Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.234Z", 
         "url": "node8.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.243Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.243Z", 
         "url": "node7.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.251Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.251Z", 
         "url": "node6.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.259Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.259Z", 
         "url": "node5.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.268Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.268Z", 
         "url": "node4.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.276Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.276Z", 
         "url": "node3.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.284Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.284Z", 
         "url": "node2.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.292Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.292Z", 
         "url": "node1.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.310Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.310Z", 
         "url": "node70.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.317Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.317Z", 
         "url": "node69.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.325Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.325Z", 
         "url": "node68.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.334Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.334Z", 
         "url": "node67.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.342Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.342Z", 
         "url": "node66.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.350Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.350Z", 
         "url": "node65.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.359Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.359Z", 
         "url": "node64.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.367Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.367Z", 
         "url": "node63.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.375Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.375Z", 
         "url": "node62.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.383Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.383Z", 
         "url": "node61.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.392Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.392Z", 
         "url": "node60.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.400Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.400Z", 
         "url": "node59.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.408Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.408Z", 
         "url": "node58.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.417Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.416Z", 
         "url": "node57.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.425Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.425Z", 
         "url": "node56.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.433Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.433Z", 
         "url": "node55.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.441Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.441Z", 
         "url": "node54.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.450Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.450Z", 
         "url": "node53.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.458Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.458Z", 
         "url": "node52.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.466Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.466Z", 
         "url": "node51.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.475Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.475Z", 
         "url": "node50.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.483Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.483Z", 
         "url": "node49.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.491Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.491Z", 
         "url": "node48.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.499Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.499Z", 
         "url": "node47.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.508Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.508Z", 
         "url": "node46.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.516Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.516Z", 
         "url": "node45.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.524Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.524Z", 
         "url": "node44.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.533Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.532Z", 
         "url": "node43.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.541Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.541Z", 
         "url": "node42.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.549Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.549Z", 
         "url": "node41.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.557Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.557Z", 
         "url": "node40.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.566Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.566Z", 
         "url": "node39.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.574Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.574Z", 
         "url": "node38.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.582Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.582Z", 
         "url": "node37.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.591Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.590Z", 
         "url": "node36.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.599Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.599Z", 
         "url": "node35.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.607Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.607Z", 
         "url": "node34.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.615Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.615Z", 
         "url": "node33.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.624Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.624Z", 
         "url": "node32.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.632Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.632Z", 
         "url": "node31.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.640Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.640Z", 
         "url": "node30.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.649Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.648Z", 
         "url": "node29.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.657Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.657Z", 
         "url": "node28.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.665Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.665Z", 
         "url": "node27.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.673Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.673Z", 
         "url": "node26.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.682Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.682Z", 
         "url": "node25.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.690Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.690Z", 
         "url": "node24.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.698Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.698Z", 
         "url": "node23.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.706Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.706Z", 
         "url": "node22.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.715Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.715Z", 
         "url": "node21.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.723Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.723Z", 
         "url": "node20.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.731Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.731Z", 
         "url": "node19.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.740Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.740Z", 
         "url": "node18.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.748Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.748Z", 
         "url": "node17.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.756Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.756Z", 
         "url": "node16.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.764Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.764Z", 
         "url": "node15.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.773Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.773Z", 
         "url": "node14.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.781Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.781Z", 
         "url": "node13.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.789Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.789Z", 
         "url": "node12.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.798Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.798Z", 
         "url": "node11.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.806Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.806Z", 
         "url": "node10.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.814Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.814Z", 
         "url": "node9.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.822Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.822Z", 
         "url": "node8.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.831Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.831Z", 
         "url": "node7.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.839Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.839Z", 
         "url": "node6.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.847Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.847Z", 
         "url": "node5.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.856Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.855Z", 
         "url": "node4.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.864Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.864Z", 
         "url": "node3.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.872Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.872Z", 
         "url": "node2.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.880Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.880Z", 
         "url": "node1.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.898Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.898Z", 
         "url": "node70.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.905Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.905Z", 
         "url": "node69.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.913Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.913Z", 
         "url": "node68.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.922Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.922Z", 
         "url": "node67.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.930Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.930Z", 
         "url": "node66.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.938Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.938Z", 
         "url": "node65.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.947Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.947Z", 
         "url": "node64.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.955Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.955Z", 
         "url": "node63.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.963Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.963Z", 
         "url": "node62.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.971Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.971Z", 
         "url": "node61.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.980Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.980Z", 
         "url": "node60.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.988Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.988Z", 
         "url": "node59.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.996Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.996Z", 
         "url": "node58.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.005Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.005Z", 
         "url": "node57.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.013Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.013Z", 
         "url": "node56.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.021Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.021Z", 
         "url": "node55.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.029Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.029Z", 
         "url": "node54.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.038Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.038Z", 
         "url": "node53.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.046Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.046Z", 
         "url": "node52.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.054Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.054Z", 
         "url": "node51.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.063Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.062Z", 
         "url": "node50.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.071Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.071Z", 
         "url": "node49.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.079Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.079Z", 
         "url": "node48.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.087Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.087Z", 
         "url": "node47.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.096Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.096Z", 
         "url": "node46.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.104Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.104Z", 
         "url": "node45.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.112Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.112Z", 
         "url": "node44.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.121Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.121Z", 
         "url": "node43.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.129Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.129Z", 
         "url": "node42.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.137Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.137Z", 
         "url": "node41.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.146Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.145Z", 
         "url": "node40.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.154Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.154Z", 
         "url": "node39.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.162Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.162Z", 
         "url": "node38.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.170Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.170Z", 
         "url": "node37.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.179Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.179Z", 
         "url": "node36.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.187Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.187Z", 
         "url": "node35.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.195Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.195Z", 
         "url": "node34.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.203Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.203Z", 
         "url": "node33.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.212Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.212Z", 
         "url": "node32.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.220Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.220Z", 
         "url": "node31.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.228Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.228Z", 
         "url": "node30.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.237Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.236Z", 
         "url": "node29.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.245Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.245Z", 
         "url": "node28.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.253Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.253Z", 
         "url": "node27.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.261Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.261Z", 
         "url": "node26.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.270Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.270Z", 
         "url": "node25.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.278Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.278Z", 
         "url": "node24.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.286Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.286Z", 
         "url": "node23.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.294Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.294Z", 
         "url": "node22.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.303Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.303Z", 
         "url": "node21.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.311Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.311Z", 
         "url": "node20.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.319Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.319Z", 
         "url": "node19.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.328Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.328Z", 
         "url": "node18.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.336Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.336Z", 
         "url": "node17.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.344Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.344Z", 
         "url": "node16.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.352Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.352Z", 
         "url": "node15.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.361Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.361Z", 
         "url": "node14.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.369Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.369Z", 
         "url": "node13.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.377Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.377Z", 
         "url": "node12.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.386Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.386Z", 
         "url": "node11.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.394Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.394Z", 
         "url": "node10.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.402Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.402Z", 
         "url": "node9.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.410Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.410Z", 
         "url": "node8.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.419Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.419Z", 
         "url": "node7.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.427Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.427Z", 
         "url": "node6.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.435Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.435Z", 
         "url": "node5.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.443Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.443Z", 
         "url": "node4.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.452Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.452Z", 
         "url": "node3.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.460Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.460Z", 
         "url": "node2.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.468Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.468Z", 
         "url": "node1.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.594Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.gatech.edu", 
         "created": "2013-12-11T23:57:20.594Z", 
         "url": "www.cs.gatech.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 30
+        "authenticated": false, 
+        "contentProvider": 30, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.619Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.stanford.edu", 
         "created": "2013-12-11T23:57:20.619Z", 
         "url": "www.cs.stanford.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 31
+        "authenticated": false, 
+        "contentProvider": 31, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.644Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.washington.edu", 
         "created": "2013-12-11T23:57:20.644Z", 
         "url": "www.cs.washington.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 32
+        "authenticated": false, 
+        "contentProvider": 32, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.669Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.mpg.de", 
         "created": "2013-12-11T23:57:20.669Z", 
         "url": "www.mpg.de", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 33
+        "authenticated": false, 
+        "contentProvider": 33, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.694Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.princeton.edu", 
         "created": "2013-12-11T23:57:20.694Z", 
         "url": "www.cs.princeton.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 34
+        "authenticated": false, 
+        "contentProvider": 34, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.719Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "onlab virtual machine images", 
         "created": "2013-12-11T23:57:20.719Z", 
         "url": "images.onlab.org", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 35
+        "authenticated": false, 
+        "contentProvider": 35, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for the Syndicate distributed filesystem", 
         "created": "2013-12-11T23:57:20.479Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "cdn.syndicatedrive.com", 
         "defaultOriginServer": 3876, 
-        "contentProvider": 29
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Georgia Tech", 
         "created": "2013-12-11T23:57:20.602Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "gt.opencdn.internet2.edu", 
         "defaultOriginServer": 3877, 
-        "contentProvider": 30
+        "contentProvider": 30, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Stanford University", 
         "created": "2013-12-11T23:57:20.627Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "stanford.opencdn.internet2.edu", 
         "defaultOriginServer": 3878, 
-        "contentProvider": 31
+        "contentProvider": 31, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for University of Washington", 
         "created": "2013-12-11T23:57:20.652Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "washington.opencdn.internet2.edu", 
         "defaultOriginServer": 3879, 
-        "contentProvider": 32
+        "contentProvider": 32, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Max Planck Institute", 
         "created": "2013-12-11T23:57:20.677Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "mp.opencdn.internet2.edu", 
         "defaultOriginServer": 3880, 
-        "contentProvider": 33
+        "contentProvider": 33, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Princeton University", 
         "created": "2013-12-11T23:57:20.702Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "princeton.opencdn.internet2.edu", 
         "defaultOriginServer": 3881, 
-        "contentProvider": 34
+        "contentProvider": 34, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for ON.LAB", 
         "created": "2013-12-11T23:57:20.727Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "onlab.vicci.org", 
         "defaultOriginServer": 3882, 
-        "contentProvider": 35
+        "contentProvider": 35, 
+        "enacted": null
     }
 },
+{
+    "pk": 5, 
+    "model": "syndicate.syndicateservice", 
+    "fields": {}
+},
+{
+    "pk": 1, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2013-12-11T23:57:20.727Z", 
+        "description": "GenBank dataset snapshot from Nov. 2013", 
+        "created": "2013-12-11T23:57:20.727Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "GenBank-11-2013", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 2, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2013-12-11T23:57:20.727Z", 
+        "description": "Volume associated with princeton_syndicate", 
+        "created": "2013-12-11T23:57:20.727Z", 
+        "blocksize": 102400, 
+        "default_gateway_caps": "31", 
+        "private": true, 
+        "name": "princeton_syndicate-Volume", 
+        "enacted": null, 
+        "archive": false, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 3, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2014-05-23T18:52:00.782Z", 
+        "description": "LSST dataset", 
+        "created": "2014-05-23T18:52:00.782Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "LSST", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 4, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2014-05-23T18:52:53.617Z", 
+        "description": "LHC dataset", 
+        "created": "2014-05-23T18:52:53.617Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "LHC", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 5, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2014-05-23T18:53:20.349Z", 
+        "description": "NOAA dataset", 
+        "created": "2014-05-23T18:53:20.349Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "NOAA", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 6, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2014-05-23T18:53:56.495Z", 
+        "description": "Measurement Lab dataset", 
+        "created": "2014-05-23T18:53:56.495Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "Measurement Lab", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 7, 
+    "model": "syndicate.volume", 
+    "fields": {
+        "updated": "2014-05-23T18:54:35.691Z", 
+        "description": "Common Crawl dataset", 
+        "created": "2014-05-23T18:54:35.691Z", 
+        "blocksize": 61440, 
+        "default_gateway_caps": "3", 
+        "private": false, 
+        "name": "Common Crawl", 
+        "enacted": null, 
+        "archive": true, 
+        "owner_id": 1
+    }
+},
+{
+    "pk": 1, 
+    "model": "syndicate.volumeaccessright", 
+    "fields": {
+        "updated": "2013-12-11T23:57:20.727Z", 
+        "created": "2013-12-11T23:57:20.727Z", 
+        "volume": 1, 
+        "gateway_caps": "3", 
+        "owner_id": 1, 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "cassandra.cassandraservice", 
+    "fields": {
+        "clusterSize": 1, 
+        "replicationFactor": 1
+    }
+},
+{
+    "pk": 13, 
+    "model": "nagios.nagiosservice", 
+    "fields": {}
+},
+{
+    "pk": 12, 
+    "model": "kairos.kairosdbservice", 
+    "fields": {}
+},
 {
     "pk": 1, 
     "model": "core.siteprivilege", 
     "fields": {
-        "site": 24, 
         "updated": "2013-12-17T18:08:58.293Z", 
+        "created": "2013-12-17T18:08:58.293Z", 
+        "site": 24, 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-17T18:08:58.293Z"
+        "enacted": null
     }
 }
 ]
index 6650547..60e2890 100644 (file)
@@ -1,4 +1,81 @@
 [
+{
+    "pk": 1, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:developer", 
+        "updated": "2014-05-19T22:11:11.408Z", 
+        "enacted": null, 
+        "name": "Developer", 
+        "created": "2014-05-19T22:11:11.408Z"
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:cdnoperations", 
+        "updated": "2014-05-19T22:11:32.782Z", 
+        "enacted": null, 
+        "name": "CDN Operations", 
+        "created": "2014-05-19T22:11:32.781Z"
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:tenant", 
+        "updated": "2014-05-19T22:11:46.731Z", 
+        "enacted": null, 
+        "name": "Tenant", 
+        "created": "2014-05-19T22:11:46.731Z"
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:hpc_historical", 
+        "updated": "2014-05-19T22:11:59.956Z", 
+        "enacted": null, 
+        "name": "Historical", 
+        "created": "2014-05-19T22:11:59.956Z"
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:customize", 
+        "updated": "2014-05-20T00:32:44.462Z", 
+        "enacted": null, 
+        "name": "Customize", 
+        "created": "2014-05-20T00:32:44.462Z"
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "template:slice_interactions", 
+        "updated": "2014-05-20T00:33:32.454Z", 
+        "enacted": null, 
+        "name": "Slice Interactions", 
+        "created": "2014-05-20T00:33:32.454Z"
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.dashboardview", 
+    "fields": {
+        "url": "cdn_nodes", 
+        "updated": "2014-05-20T00:33:52.101Z", 
+        "enacted": null, 
+        "name": "template:CDN Nodes", 
+        "created": "2014-05-20T00:33:52.101Z"
+    }
+},
 {
     "pk": 3, 
     "model": "core.service", 
@@ -7,9 +84,10 @@
         "description": "Used to help accelerate delivery of content through the CDN.", 
         "created": "2013-11-26T12:45:24.212Z", 
         "enabled": true, 
+        "name": "HPC Service", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "HPC Service"
+        "enacted": null
     }
 },
 {
         "description": "Service to help load balance and direct traffic flow to content within the CDN", 
         "created": "2013-11-26T12:45:59.003Z", 
         "enabled": true, 
+        "name": "Request Router Service", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "Request Router Service"
+        "enacted": null
     }
 },
 {
         "description": "Syndicate Shared Filesystem.", 
         "created": "2013-12-04T22:51:07.137Z", 
         "enabled": true, 
+        "name": "Syndicate", 
         "versionNumber": "", 
         "published": true, 
-        "name": "Syndicate"
+        "enacted": null
     }
 },
 {
         "description": "A provisioning service for long-term experiments.", 
         "created": "2013-12-13T21:48:58.304Z", 
         "enabled": true, 
+        "name": "Raven", 
         "versionNumber": "1.0", 
         "published": true, 
-        "name": "Raven"
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:47.910Z", 
         "name": "Stanford", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.stanford.edu/", 
         "location": "37.4294,-122.17200000000003", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            5
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:38.431Z", 
         "name": "Washington", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "https://www.washington.edu/", 
         "location": "47.6531,-122.31299999999999", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            6
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:28.495Z", 
         "name": "Princeton", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://princeton.edu/", 
         "location": "40.3502,-74.6524", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            7
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:18.964Z", 
         "name": "GeorgiaTech", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.gatech.edu/", 
         "location": "33.7772,-84.39760000000001", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            8
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:00:07.704Z", 
         "name": "MaxPlanck", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.mpi-sws.mpg.de/", 
         "location": "49.14,6.588999999999942", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            9
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Atlanta", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "33.0075,-84.0038", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Chicago", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "41.0085,-87.0065", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Houston", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "29.0077,-95.0037", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Kansas City", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "39.0012,-94.0063", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Los Angeles", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "33.2505,-117.503", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 New York", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "40.72,-73.99", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Salt Lake City", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "40.7659,-111.844", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Seattle", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "47.6531,-122.313", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-06-21T21:17:13.982Z", 
         "name": "I2 Washington DC", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu", 
         "location": "38.009,-77.0003", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T17:30:14.491Z", 
         "name": "ON.Lab", 
         "created": "2013-04-03T23:14:11.072Z", 
-        "tenant_id": "", 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.onlab.us/", 
         "location": "37.452955,-122.18176599999998", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            5, 
-            6, 
-            7, 
-            8, 
-            9, 
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:21:43.870Z", 
         "name": "I2 Singapore", 
         "created": "2013-12-17T17:08:49.669Z", 
-        "tenant_id": null, 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.internet2.edu/", 
         "location": "1.33544,103.88999999999999", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": [
-            10
-        ], 
-        "abbreviated_name": ""
+        "abbreviated_name": "", 
+        "enacted": null
     }
 },
 {
         "updated": "2013-12-17T18:08:01.373Z", 
         "name": "Arizona", 
         "created": "2013-12-17T18:07:14.190Z", 
-        "tenant_id": null, 
         "enabled": true, 
         "longitude": null, 
         "site_url": "http://www.cs.arizona.edu/", 
         "location": "32.2333,-110.94799999999998", 
         "latitude": null, 
         "is_public": true, 
-        "deployments": []
-        "abbreviated_name": ""
+        "abbreviated_name": ""
+        "enacted": null
     }
 },
 {
     "model": "core.siterole", 
     "fields": {
         "updated": "2013-12-17T18:08:54.842Z", 
+        "enacted": null, 
         "role": "pi", 
         "created": "2013-12-17T18:08:54.842Z"
     }
 },
+{
+    "pk": 2, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:09.655Z", 
+        "enacted": null, 
+        "role": "admin", 
+        "created": "2014-04-22T11:34:09.655Z"
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:27.403Z", 
+        "enacted": null, 
+        "role": "tech", 
+        "created": "2014-04-22T11:34:27.403Z"
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.siterole", 
+    "fields": {
+        "updated": "2014-04-22T11:34:39.770Z", 
+        "enacted": null, 
+        "role": "billing", 
+        "created": "2014-04-22T11:34:39.770Z"
+    }
+},
 {
     "pk": 5, 
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Stanford", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Washington", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-Princeton", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "US-GeorgiaTech", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "EU-MaxPlanck", 
         "created": "2013-04-03T22:57:23.015Z"
     }
     "model": "core.deployment", 
     "fields": {
         "updated": "2013-04-03T22:57:23.015Z", 
+        "enacted": null, 
         "name": "Internet2", 
         "created": "2013-04-03T22:57:23.015Z"
     }
 },
+{
+    "pk": 1, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.453Z", 
+        "created": "2014-05-07T23:52:01.453Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
+{
+    "pk": 2, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.455Z", 
+        "created": "2014-05-07T23:52:01.455Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 3, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.456Z", 
+        "created": "2014-05-07T23:52:01.456Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 4, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.457Z", 
+        "created": "2014-05-07T23:52:01.456Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 5, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.457Z", 
+        "created": "2014-05-07T23:52:01.457Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 6, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-07T23:52:01.458Z", 
+        "created": "2014-05-07T23:52:01.458Z", 
+        "tenant_id": null, 
+        "site": 22, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 7, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:00:37.305Z", 
+        "created": "2014-05-08T00:00:37.305Z", 
+        "tenant_id": null, 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 8, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:01:18.181Z", 
+        "created": "2014-05-08T00:01:18.181Z", 
+        "tenant_id": null, 
+        "site": 21, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 9, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:01:29.768Z", 
+        "created": "2014-05-08T00:01:29.768Z", 
+        "tenant_id": null, 
+        "site": 20, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 10, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:01:52.173Z", 
+        "created": "2014-05-08T00:01:52.173Z", 
+        "tenant_id": null, 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 11, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:03.435Z", 
+        "created": "2014-05-08T00:02:03.435Z", 
+        "tenant_id": null, 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 12, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:16.038Z", 
+        "created": "2014-05-08T00:02:16.038Z", 
+        "tenant_id": null, 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 13, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:33.626Z", 
+        "created": "2014-05-08T00:02:33.626Z", 
+        "tenant_id": null, 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 14, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:02:46.549Z", 
+        "created": "2014-05-08T00:02:46.549Z", 
+        "tenant_id": null, 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 15, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:01.445Z", 
+        "created": "2014-05-08T00:03:01.445Z", 
+        "tenant_id": null, 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 16, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:18.238Z", 
+        "created": "2014-05-08T00:03:18.238Z", 
+        "tenant_id": null, 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
+    }
+},
+{
+    "pk": 17, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:32.156Z", 
+        "created": "2014-05-08T00:03:32.156Z", 
+        "tenant_id": null, 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
+    }
+},
+{
+    "pk": 18, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:45.449Z", 
+        "created": "2014-05-08T00:03:45.448Z", 
+        "tenant_id": null, 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
+    }
+},
+{
+    "pk": 19, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:03:59.510Z", 
+        "created": "2014-05-08T00:03:59.510Z", 
+        "tenant_id": null, 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
+    }
+},
+{
+    "pk": 20, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:04:12.516Z", 
+        "created": "2014-05-08T00:04:12.516Z", 
+        "tenant_id": null, 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
+    }
+},
+{
+    "pk": 21, 
+    "model": "core.sitedeployments", 
+    "fields": {
+        "updated": "2014-05-08T00:04:25.576Z", 
+        "created": "2014-05-08T00:04:25.576Z", 
+        "tenant_id": null, 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
 {
     "pk": 1, 
     "model": "core.user", 
         "is_active": true, 
         "site": null, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
-        "last_login": "2013-12-18T18:31:06.731Z", 
+        "last_login": "2014-04-22T11:32:36.356Z", 
         "timezone": "America/New_York", 
         "is_admin": true, 
         "password": "pbkdf2_sha256$10000$v5qKhIyhSQ2N$V8vh2mkqYdjQib6d2jBkpwV57eMBfhd/9eiXqaDLUWg=", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-14T03:21:24.872Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-04T20:46:15.904Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-18T21:47:08.698Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-17T16:21:46.493Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 10, 
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-18T21:41:10.802Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-19T01:32:31.049Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": null, 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-09-22T21:48:01.047Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 22, 
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-19T00:59:55.668Z", 
         "timezone": "America/New_York", 
         "is_active": true, 
         "site": 24, 
         "phone": "", 
-        "kuser_id": null, 
         "is_staff": true, 
         "last_login": "2013-12-17T18:08:01.356Z", 
         "timezone": "America/New_York", 
     "fields": {
         "updated": "2013-05-10T23:30:52.931Z", 
         "membershipFee": 0, 
+        "description": "Best Effort", 
         "membershipFeeMonths": 0, 
         "created": "2013-05-10T23:30:52.931Z", 
         "upgradeFrom": [
         "commitment": 0, 
         "name": "Best Effort", 
         "upgradeRequiresApproval": false, 
-        "description": "Best Effort"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-05-10T23:35:51.694Z", 
         "membershipFee": 100, 
+        "description": "Silver", 
         "membershipFeeMonths": 1, 
         "created": "2013-05-10T23:33:24.930Z", 
         "upgradeFrom": [
         "commitment": 365, 
         "name": "Silver", 
         "upgradeRequiresApproval": false, 
-        "description": "Silver"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-05-10T23:34:01.320Z", 
         "membershipFee": 18000, 
+        "description": "Gold", 
         "membershipFeeMonths": 12, 
         "created": "2013-05-10T23:34:01.320Z", 
         "upgradeFrom": [
         "commitment": 365, 
         "name": "Gold", 
         "upgradeRequiresApproval": false, 
-        "description": "Gold"
+        "enacted": null
     }
 },
 {
     "pk": 4, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T22:24:44.850Z", 
         "name": "HyperCache", 
         "service": 3, 
         "created": "2013-04-03T23:14:11.072Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "HyperCache slice for HyperCache service.", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": 1, 
-        "description": "HyperCache slice for HyperCache service."
+        "enacted": null
     }
 },
 {
     "pk": 6, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-19T00:14:36.783Z", 
         "name": "Syndicate", 
         "service": 5, 
         "created": "2013-04-03T23:14:11.072Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": 1, 
-        "description": ""
+        "enacted": null
     }
 },
 {
     "pk": 8, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-19T00:15:11.298Z", 
         "name": "DnsRedir", 
         "service": 4, 
         "created": "2013-12-04T22:48:35.584Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "DNS Redirection slice for RequestRouter service.", 
         "serviceClass": 2, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": 8, 
-        "description": "DNS Redirection slice for RequestRouter service."
+        "enacted": null
     }
 },
 {
     "pk": 9, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T23:32:07.617Z", 
         "name": "DnsDemux", 
         "service": 4, 
         "created": "2013-12-04T22:49:23.051Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "DNS Demultiplexing slice for RequestRouter service. ", 
         "serviceClass": 2, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": 8, 
-        "description": "DNS Demultiplexing slice for RequestRouter service. "
+        "enacted": null
     }
 },
 {
     "pk": 10, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T22:06:00.330Z", 
         "name": "Infrastructure", 
         "service": null, 
         "created": "2013-12-09T14:13:15.392Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": ""
+        "enacted": null
     }
 },
 {
     "pk": 11, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-17T18:09:29.065Z", 
         "name": "Stork", 
         "service": 8, 
         "created": "2013-12-13T21:49:59.476Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "The Stork Package Management Service", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 24, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": "The Stork Package Management Service"
+        "enacted": null
     }
 },
 {
     "pk": 12, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-17T18:09:20.587Z", 
         "name": "Owl", 
         "service": 8, 
         "created": "2013-12-13T21:52:15.590Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "The Owl Data Collection service", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 24, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": "The Owl Data Collection service"
+        "enacted": null
     }
 },
 {
     "pk": 13, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T23:34:55.351Z", 
         "name": "Hadoop", 
         "service": null, 
         "created": "2013-12-13T21:54:20.895Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "Hadoop map-reduce service", 
         "serviceClass": 2, 
         "enabled": true, 
         "site": 22, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": "Hadoop map-reduce service"
+        "enacted": null
     }
 },
 {
     "pk": 14, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T22:21:36.462Z", 
         "name": "test", 
         "service": null, 
         "created": "2013-12-13T21:56:57.299Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "Test slice number one.", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 10, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": "Test slice number one."
+        "enacted": null
     }
 },
 {
     "pk": 15, 
     "model": "core.slice", 
     "fields": {
-        "router_id": null, 
         "updated": "2013-12-18T22:22:04.676Z", 
         "name": "test2", 
         "service": null, 
         "created": "2013-12-13T22:00:03.049Z", 
-        "network_id": null, 
-        "tenant_id": "", 
+        "description": "test slice number two.", 
         "serviceClass": 1, 
         "enabled": true, 
         "site": 10, 
         "omf_friendly": false, 
-        "subnet_id": null, 
         "slice_url": "", 
         "creator": null, 
-        "description": "test slice number two."
+        "enacted": null
     }
 },
 {
     "model": "core.slicerole", 
     "fields": {
         "updated": "2013-12-18T21:09:27.717Z", 
+        "enacted": null, 
         "role": "admin", 
         "created": "2013-12-18T21:09:27.717Z"
     }
     "model": "core.slicerole", 
     "fields": {
         "updated": "2013-12-18T21:09:35.074Z", 
+        "enacted": null, 
         "role": "default", 
         "created": "2013-12-18T21:09:35.074Z"
     }
     "fields": {
         "updated": "2013-12-18T21:21:37.713Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.713Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:37.713Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.729Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.729Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:37.729Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.739Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.739Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:37.739Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.752Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.752Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:37.752Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.771Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.771Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:37.771Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.790Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.789Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:37.789Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.808Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.808Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:37.808Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.835Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.835Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:37.835Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.862Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.862Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:37.862Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.890Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.890Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:37.890Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.925Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.925Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:37.925Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.960Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.960Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:37.960Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:37.996Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:37.996Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:37.996Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.038Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:38.038Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:38.038Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.092Z", 
         "slice": 4, 
+        "created": "2013-12-18T21:21:38.091Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:38.091Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.103Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.103Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:38.103Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.111Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.111Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:38.111Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.122Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.122Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:38.122Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.141Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.141Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:38.141Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.160Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.160Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:38.160Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.179Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.179Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:38.179Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.206Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.206Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:38.206Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.233Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.233Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:38.233Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.260Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.260Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:38.260Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.287Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.287Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:38.287Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.322Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.322Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:38.322Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.358Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.358Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:38.358Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.393Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.393Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:38.393Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.428Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.428Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:38.428Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.472Z", 
         "slice": 6, 
+        "created": "2013-12-18T21:21:38.472Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:38.472Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.484Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.484Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:38.484Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.492Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.492Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:38.492Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.503Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.503Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:38.503Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.522Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.522Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:38.522Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.540Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.540Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:38.540Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.559Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.559Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:38.559Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.578Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.578Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:38.578Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.605Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.605Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:38.605Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.632Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.632Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:38.632Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.660Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.660Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:38.660Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.695Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.695Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:38.695Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.731Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.731Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:38.731Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.766Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.766Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:38.766Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.801Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.801Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:38.801Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.845Z", 
         "slice": 8, 
+        "created": "2013-12-18T21:21:38.845Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:38.845Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.857Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.857Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:38.857Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.865Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.864Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:38.864Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.875Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.875Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:38.875Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.894Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.894Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:38.894Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.913Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.913Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:38.913Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.932Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.932Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:38.932Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.951Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.951Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:38.951Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:38.978Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:38.978Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:38.978Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.005Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.005Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:39.005Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.032Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.032Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:39.032Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.068Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.067Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:39.067Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.103Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.103Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:39.103Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.139Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.139Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:39.139Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.175Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.175Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:39.175Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.219Z", 
         "slice": 9, 
+        "created": "2013-12-18T21:21:39.219Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:39.219Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.229Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.229Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:39.229Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.238Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.238Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:39.238Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.248Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.248Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:39.248Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.267Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.267Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:39.267Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.286Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.286Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:39.286Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.304Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.304Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:39.304Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.324Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.324Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:39.324Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.351Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.351Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:39.351Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.378Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.378Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:39.378Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.405Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.405Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:39.405Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.440Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.440Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:39.440Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.476Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.476Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:39.476Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.511Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.511Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:39.511Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.547Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.547Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:39.547Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.590Z", 
         "slice": 10, 
+        "created": "2013-12-18T21:21:39.590Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:39.590Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.602Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.602Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:39.602Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.610Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.610Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:39.610Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.621Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.621Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:39.621Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.640Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.640Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:39.640Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.659Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.659Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:39.659Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.678Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.678Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:39.678Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.705Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.705Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:39.705Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.732Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.732Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:39.732Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.759Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.759Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:39.759Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.786Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.786Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:39.786Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.821Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.821Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:39.821Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.857Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.857Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:39.857Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.891Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.891Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:39.891Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.927Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.927Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:39.927Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.971Z", 
         "slice": 11, 
+        "created": "2013-12-18T21:21:39.971Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:39.971Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.983Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:39.983Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:39.983Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:39.991Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:39.991Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:39.991Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.002Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.002Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:40.002Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.020Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.020Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:40.020Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.039Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.039Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:40.039Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.058Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.058Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:40.058Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.077Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.077Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:40.077Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.104Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.104Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:40.104Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.131Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.131Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:40.131Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.159Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.159Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:40.159Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.194Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.194Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:40.194Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.230Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.230Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:40.230Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.265Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.265Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:40.265Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.300Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.300Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:40.300Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.344Z", 
         "slice": 12, 
+        "created": "2013-12-18T21:21:40.344Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:40.344Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.356Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.355Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:40.355Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.364Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.364Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:40.364Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.374Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.374Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:40.374Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.393Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.393Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:40.393Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.412Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.412Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:40.412Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.431Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.431Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:40.431Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.450Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.450Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:40.450Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.477Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.477Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:40.477Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.504Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.504Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:40.504Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.531Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.531Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:40.531Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.566Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.566Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:40.566Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.602Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.602Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:40.602Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.637Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.637Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:40.637Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.673Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.673Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:40.673Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.717Z", 
         "slice": 13, 
+        "created": "2013-12-18T21:21:40.717Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:40.717Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.728Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.728Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:40.728Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.736Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.736Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:40.736Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.747Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.747Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:40.747Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.766Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.766Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:40.766Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.784Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.784Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:40.784Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.803Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.803Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:40.803Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.822Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.822Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:40.822Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.849Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.849Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:40.849Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.877Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.877Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:40.877Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.903Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.903Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:40.903Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.939Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.939Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:40.939Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:40.975Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:40.975Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:40.975Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.010Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:41.010Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:41.010Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.045Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:41.045Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:41.045Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.089Z", 
         "slice": 14, 
+        "created": "2013-12-18T21:21:41.089Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:41.089Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.101Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.101Z", 
         "role": 1, 
         "user": 2, 
-        "created": "2013-12-18T21:21:41.101Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.109Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.109Z", 
         "role": 1, 
         "user": 3, 
-        "created": "2013-12-18T21:21:41.109Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.119Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.119Z", 
         "role": 1, 
         "user": 4, 
-        "created": "2013-12-18T21:21:41.119Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.138Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.138Z", 
         "role": 1, 
         "user": 5, 
-        "created": "2013-12-18T21:21:41.138Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.157Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.157Z", 
         "role": 1, 
         "user": 6, 
-        "created": "2013-12-18T21:21:41.157Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.176Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.176Z", 
         "role": 1, 
         "user": 7, 
-        "created": "2013-12-18T21:21:41.176Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.204Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.203Z", 
         "role": 1, 
         "user": 9, 
-        "created": "2013-12-18T21:21:41.203Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.231Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.231Z", 
         "role": 1, 
         "user": 10, 
-        "created": "2013-12-18T21:21:41.231Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.258Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.258Z", 
         "role": 1, 
         "user": 11, 
-        "created": "2013-12-18T21:21:41.258Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.285Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.285Z", 
         "role": 1, 
         "user": 12, 
-        "created": "2013-12-18T21:21:41.285Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.320Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.320Z", 
         "role": 1, 
         "user": 13, 
-        "created": "2013-12-18T21:21:41.320Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.356Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.356Z", 
         "role": 1, 
         "user": 14, 
-        "created": "2013-12-18T21:21:41.356Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.391Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.391Z", 
         "role": 1, 
         "user": 15, 
-        "created": "2013-12-18T21:21:41.391Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.426Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.426Z", 
         "role": 1, 
         "user": 1, 
-        "created": "2013-12-18T21:21:41.426Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:21:41.470Z", 
         "slice": 15, 
+        "created": "2013-12-18T21:21:41.470Z", 
         "role": 1, 
         "user": 8, 
-        "created": "2013-12-18T21:21:41.470Z"
+        "enacted": null
     }
 },
 {
         "created": "2013-12-09T14:26:56.787Z", 
         "container_format": "bare", 
         "disk_format": "raw", 
-        "image_id": "d4bdbba2-6883-4232-863a-202fd4c56c21"
+        "enacted": null
     }
 },
 {
     "pk": 384, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node1.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 385, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node2.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 386, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node3.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 387, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node4.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 388, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node5.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 389, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node6.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 390, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node7.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 391, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node8.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 392, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node9.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 393, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node10.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 394, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node11.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 395, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node12.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 396, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node13.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 397, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node14.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 398, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node15.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 399, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node16.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 400, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node17.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 401, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node18.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 402, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node19.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 403, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node20.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 404, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node21.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 405, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node22.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 406, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node23.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 407, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node24.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 408, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node25.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 409, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node26.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 410, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node27.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 411, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node28.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 412, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node29.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 413, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node30.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 414, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node31.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 415, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node32.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 416, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node33.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 417, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node34.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 418, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node35.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 419, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node36.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 420, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node37.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 421, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node38.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 422, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node39.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 423, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node40.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 424, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node41.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 425, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node42.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 426, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node43.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 427, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node44.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 428, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node45.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 429, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node46.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 430, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node47.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 431, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node48.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 432, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node49.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 433, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node50.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 434, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node51.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 435, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node52.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 436, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node53.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 437, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node54.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 438, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node55.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 439, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node56.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 440, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node57.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 441, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node58.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
-    }
-},
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
+    }
+},
 {
     "pk": 442, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node59.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 443, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node60.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 444, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node61.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 445, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node62.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 446, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node63.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 447, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node64.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 448, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node65.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 449, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node66.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 450, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node67.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 451, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node68.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 452, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node69.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 453, 
     "model": "core.node", 
     "fields": {
-        "site": 8, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 5, 
         "name": "node70.stanford.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 8, 
+        "deployment": 5, 
+        "enacted": null
     }
 },
 {
     "pk": 454, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node1.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 455, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node2.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 456, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node3.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 457, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node4.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 458, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node5.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 459, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node6.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 460, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node7.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 461, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node8.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 462, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node9.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 463, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node10.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 464, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node11.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 465, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node12.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 466, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node13.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 467, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node14.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 468, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node15.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 469, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node16.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 470, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node17.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 471, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node18.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 472, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node19.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 473, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node20.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 474, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node21.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 475, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node22.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 476, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node23.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 477, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node24.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 478, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node25.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 479, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node26.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 480, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node27.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 481, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node28.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 482, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node29.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 483, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node30.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 484, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node31.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 485, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node32.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 486, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node33.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 487, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node34.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 488, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node35.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 489, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node36.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 490, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node37.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 491, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node38.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 492, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node39.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 493, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node40.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 494, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node41.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 495, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node42.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 496, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node43.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 497, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node44.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 498, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node45.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 499, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node46.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 500, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node47.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 501, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node48.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 502, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node49.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 503, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node50.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 504, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node51.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 505, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node52.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 506, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node53.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 507, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node54.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 508, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node55.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 509, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node56.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 510, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node57.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 511, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node58.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 512, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node59.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 513, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node60.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 514, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node61.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 515, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node62.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 516, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node63.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 517, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node64.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 518, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node65.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 519, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node66.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 520, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node67.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 521, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node68.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 522, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node69.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 523, 
     "model": "core.node", 
     "fields": {
-        "site": 9, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 6, 
         "name": "node70.washington.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 9, 
+        "deployment": 6, 
+        "enacted": null
     }
 },
 {
     "pk": 524, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node1.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 525, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node2.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 526, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node3.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 527, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node4.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 528, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node5.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 529, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node6.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 530, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node7.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 531, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node8.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 532, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node9.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 533, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node10.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 534, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node11.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 535, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node12.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 536, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node13.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 537, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node14.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 538, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node15.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 539, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node16.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 540, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node17.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 541, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node18.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 542, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node19.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 543, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node20.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 544, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node21.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 545, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node22.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 546, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node23.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 547, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node24.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 548, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node25.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 549, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node26.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 550, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node27.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 551, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node28.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 552, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node29.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 553, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node30.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 554, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node31.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 555, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node32.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 556, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node33.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 557, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node34.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 558, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node35.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 559, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node36.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 560, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node37.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 561, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node38.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 562, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node39.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 563, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node40.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 564, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node41.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 565, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node42.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 566, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node43.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 567, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node44.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 568, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node45.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 569, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node46.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 570, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node47.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 571, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node48.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 572, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node49.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 573, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node50.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 574, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node51.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 575, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node52.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 576, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node53.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 577, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node54.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 578, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node55.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 579, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node56.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 580, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node57.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 581, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node58.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 582, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node59.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 583, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node60.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 584, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node61.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 585, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node62.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 586, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node63.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 587, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node64.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 588, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node65.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 589, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node66.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 590, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node67.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 591, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node68.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 592, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node69.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 593, 
     "model": "core.node", 
     "fields": {
-        "site": 10, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 7, 
         "name": "node70.princeton.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 10, 
+        "deployment": 7, 
+        "enacted": null
     }
 },
 {
     "pk": 594, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node1.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 595, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node2.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 596, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node3.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 597, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node4.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 598, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node5.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 599, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node6.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 600, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node7.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 601, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node8.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 602, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node9.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 603, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node10.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 604, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node11.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 605, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node12.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 606, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node13.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 607, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node14.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 608, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node15.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 609, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node16.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 610, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node17.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 611, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node18.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 612, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node19.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 613, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node20.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 614, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node21.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 615, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node22.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 616, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node23.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 617, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node24.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 618, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node25.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 619, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node26.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 620, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node27.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 621, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node28.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 622, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node29.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 623, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node30.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 624, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node31.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 625, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node32.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 626, 
     "model": "core.node", 
     "fields": {
+        "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node33.gt.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
         "site": 11, 
-        "updated": "2013-06-21T21:17:13.982Z", 
         "deployment": 8, 
-        "name": "node33.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "enacted": null
     }
 },
 {
     "pk": 627, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node34.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 628, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node35.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 629, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node36.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 630, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node37.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 631, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node38.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 632, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node39.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 633, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node40.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 634, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node41.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 635, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node42.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 636, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node43.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 637, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node44.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 638, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node45.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 639, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node46.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 640, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node47.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 641, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node48.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 642, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node49.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 643, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node50.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 644, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node51.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 645, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node52.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 646, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node53.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 647, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node54.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 648, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node55.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 649, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node56.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 650, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node57.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 651, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node58.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 652, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node59.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 653, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node60.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 654, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node61.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 655, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node62.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 656, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node63.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 657, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node64.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 658, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node65.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 659, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node66.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 660, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node67.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 661, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node68.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 662, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node69.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 663, 
     "model": "core.node", 
     "fields": {
-        "site": 11, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 8, 
         "name": "node70.gt.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 11, 
+        "deployment": 8, 
+        "enacted": null
     }
 },
 {
     "pk": 664, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node1.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 665, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node2.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 666, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node3.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 667, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node4.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 668, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node5.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 669, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node6.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 670, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node7.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 671, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node8.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 672, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node9.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 673, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node10.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 674, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node11.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 675, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node12.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 676, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node13.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 677, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node14.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 678, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node15.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 679, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node16.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 680, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node17.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 681, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node18.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 682, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node19.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 683, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node20.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 684, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node21.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 685, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node22.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 686, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node23.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 687, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node24.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 688, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node25.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 689, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node26.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 690, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node27.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 691, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node28.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 692, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node29.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 693, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node30.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 694, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node31.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 695, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node32.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 696, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node33.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 697, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node34.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 698, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node35.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 699, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node36.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 700, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node37.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 701, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node38.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 702, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node39.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 703, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node40.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 704, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node41.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 705, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node42.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 706, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node43.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 707, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node44.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 708, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node45.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 709, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node46.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 710, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node47.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 711, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
+        "name": "node48.mpisws.vicci.org", 
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
         "deployment": 9, 
-        "name": "node48.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "enacted": null
     }
 },
 {
     "pk": 712, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node49.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 713, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node50.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 714, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node51.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 715, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node52.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 716, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node53.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 717, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node54.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 718, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node55.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 719, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node56.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 720, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node57.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 721, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node58.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 722, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node59.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 723, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node60.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 724, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node61.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 725, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node62.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 726, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node63.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 727, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node64.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 728, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node65.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 729, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node66.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 730, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node67.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 731, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node68.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 732, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node69.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 733, 
     "model": "core.node", 
     "fields": {
-        "site": 12, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 9, 
         "name": "node70.mpisws.vicci.org", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 12, 
+        "deployment": 9, 
+        "enacted": null
     }
 },
 {
     "pk": 734, 
     "model": "core.node", 
     "fields": {
-        "site": 13, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.atla.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 735, 
     "model": "core.node", 
     "fields": {
-        "site": 13, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.atla.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 13, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 736, 
     "model": "core.node", 
     "fields": {
-        "site": 14, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.chic.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 737, 
     "model": "core.node", 
     "fields": {
-        "site": 14, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.chic.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 14, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 738, 
     "model": "core.node", 
     "fields": {
-        "site": 15, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.hous.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 739, 
     "model": "core.node", 
     "fields": {
-        "site": 15, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.hous.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 15, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 740, 
     "model": "core.node", 
     "fields": {
-        "site": 16, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.kans.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 741, 
     "model": "core.node", 
     "fields": {
-        "site": 16, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.kans.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 16, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 742, 
     "model": "core.node", 
     "fields": {
-        "site": 17, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.losa.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 743, 
     "model": "core.node", 
     "fields": {
-        "site": 17, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.losa.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 17, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 744, 
     "model": "core.node", 
     "fields": {
-        "site": 18, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.newy.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 745, 
     "model": "core.node", 
     "fields": {
-        "site": 18, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.newy.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 18, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 746, 
     "model": "core.node", 
     "fields": {
-        "site": 19, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.salt.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 747, 
     "model": "core.node", 
     "fields": {
-        "site": 19, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.salt.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 19, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 748, 
     "model": "core.node", 
     "fields": {
-        "site": 20, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.seat.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 20, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 749, 
     "model": "core.node", 
     "fields": {
-        "site": 20, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.seat.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 20, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 750, 
     "model": "core.node", 
     "fields": {
-        "site": 21, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node1.wash.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 21, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 751, 
     "model": "core.node", 
     "fields": {
-        "site": 21, 
         "updated": "2013-06-21T21:17:13.982Z", 
-        "deployment": 10, 
         "name": "node2.wash.internet2.vini-veritas.net", 
-        "created": "2013-04-03T23:14:11.072Z"
+        "created": "2013-04-03T23:14:11.072Z", 
+        "site": 21, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 752, 
     "model": "core.node", 
     "fields": {
-        "site": 23, 
         "updated": "2013-12-17T17:10:48.740Z", 
-        "deployment": 10, 
         "name": "opencloud0.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.740Z"
+        "created": "2013-12-17T17:10:48.740Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 753, 
     "model": "core.node", 
     "fields": {
-        "site": 23, 
         "updated": "2013-12-17T17:10:48.742Z", 
-        "deployment": 10, 
         "name": "opencloud1.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.741Z"
+        "created": "2013-12-17T17:10:48.741Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 754, 
     "model": "core.node", 
     "fields": {
-        "site": 23, 
         "updated": "2013-12-17T17:10:48.742Z", 
-        "deployment": 10, 
         "name": "opencloud2.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.742Z"
+        "created": "2013-12-17T17:10:48.742Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
     "pk": 755, 
     "model": "core.node", 
     "fields": {
-        "site": 23, 
         "updated": "2013-12-17T17:10:48.743Z", 
-        "deployment": 10, 
         "name": "opencloud3.sing.internet2.edu", 
-        "created": "2013-12-17T17:10:48.743Z"
+        "created": "2013-12-17T17:10:48.743Z", 
+        "site": 23, 
+        "deployment": 10, 
+        "enacted": null
     }
 },
 {
         "created": "2013-12-11T22:18:00.040Z", 
         "serviceClass": 1, 
         "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
         "bucketInRate": 0, 
         "cost": 7, 
-        "calendarReservable": false
+        "maxUnitsNode": 0
         "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "enacted": null
     }
 },
 {
         "created": "2013-12-11T22:18:00.045Z", 
         "serviceClass": 2, 
         "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
         "bucketInRate": 0, 
         "cost": 7, 
-        "calendarReservable": false
+        "maxUnitsNode": 0
         "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "enacted": null
     }
 },
 {
         "created": "2013-12-11T22:18:00.053Z", 
         "serviceClass": 3, 
         "maxUnitsDeployment": 0, 
+        "calendarReservable": false, 
         "bucketInRate": 0, 
         "cost": 7, 
-        "calendarReservable": false
+        "maxUnitsNode": 0
         "maxDuration": 0, 
-        "maxUnitsNode": 0
+        "enacted": null
     }
 },
 {
         "created": "2013-12-11T22:18:00.064Z", 
         "serviceClass": 3, 
         "maxUnitsDeployment": 210, 
+        "calendarReservable": true, 
         "bucketInRate": 0, 
         "cost": 0, 
-        "calendarReservable": true
+        "maxUnitsNode": 6
         "maxDuration": 8760, 
-        "maxUnitsNode": 6
+        "enacted": null
     }
 },
 {
         "created": "2013-12-11T22:18:00.072Z", 
         "serviceClass": 2, 
         "maxUnitsDeployment": 210, 
+        "calendarReservable": true, 
         "bucketInRate": 10, 
         "cost": 7, 
-        "calendarReservable": true
+        "maxUnitsNode": 6
         "maxDuration": 168, 
-        "maxUnitsNode": 6
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 0, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
         "image": 1, 
         "creator": 8, 
         "numberCores": 1, 
-        "instance_id": null
+        "instance_id": null, 
+        "enacted": null
     }
 },
 {
     "pk": 1, 
     "model": "core.reservation", 
     "fields": {
-        "duration": 48, 
         "updated": "2013-12-18T23:32:41.619Z", 
         "slice": 9, 
+        "created": "2013-12-18T23:32:07.665Z", 
         "startTime": "2013-12-20T20:31:42Z", 
-        "created": "2013-12-18T23:32:07.665Z"
+        "duration": 48, 
+        "enacted": null
     }
 },
 {
     "pk": 2, 
     "model": "core.reservation", 
     "fields": {
-        "duration": 48, 
         "updated": "2013-12-18T23:34:02.148Z", 
         "slice": 8, 
+        "created": "2013-12-18T23:33:27.591Z", 
         "startTime": "2013-12-20T20:33:23Z", 
-        "created": "2013-12-18T23:33:27.591Z"
+        "duration": 48, 
+        "enacted": null
     }
 },
 {
     "pk": 3, 
     "model": "core.reservation", 
     "fields": {
-        "duration": 24, 
         "updated": "2013-12-18T23:35:45.483Z", 
         "slice": 13, 
+        "created": "2013-12-18T23:34:55.406Z", 
         "startTime": "2013-12-20T20:34:32Z", 
-        "created": "2013-12-18T23:34:55.406Z"
+        "duration": 24, 
+        "enacted": null
     }
 },
 {
     "pk": 4, 
     "model": "core.reservation", 
     "fields": {
-        "duration": 24, 
         "updated": "2013-12-18T23:35:25.727Z", 
         "slice": 13, 
+        "created": "2013-12-18T23:34:55.407Z", 
         "startTime": "2013-12-23T20:34:49Z", 
-        "created": "2013-12-18T23:34:55.407Z"
+        "duration": 24, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:32:41.622Z", 
-        "reservationSet": 1, 
-        "created": "2013-12-18T23:32:41.622Z", 
         "resource": 8, 
         "quantity": 5, 
-        "sliver": 78
+        "created": "2013-12-18T23:32:41.622Z", 
+        "reservationSet": 1, 
+        "sliver": 78, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:34:02.152Z", 
-        "reservationSet": 2, 
-        "created": "2013-12-18T23:34:02.152Z", 
         "resource": 8, 
         "quantity": 5, 
-        "sliver": 77
+        "created": "2013-12-18T23:34:02.152Z", 
+        "reservationSet": 2, 
+        "sliver": 77, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:25.731Z", 
-        "reservationSet": 4, 
-        "created": "2013-12-18T23:35:25.731Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 84
+        "created": "2013-12-18T23:35:25.731Z", 
+        "reservationSet": 4, 
+        "sliver": 84, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:25.732Z", 
-        "reservationSet": 4, 
-        "created": "2013-12-18T23:35:25.732Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 85
+        "created": "2013-12-18T23:35:25.732Z", 
+        "reservationSet": 4, 
+        "sliver": 85, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:25.733Z", 
-        "reservationSet": 4, 
-        "created": "2013-12-18T23:35:25.733Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 86
+        "created": "2013-12-18T23:35:25.733Z", 
+        "reservationSet": 4, 
+        "sliver": 86, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:45.486Z", 
-        "reservationSet": 3, 
-        "created": "2013-12-18T23:35:45.486Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 84
+        "created": "2013-12-18T23:35:45.486Z", 
+        "reservationSet": 3, 
+        "sliver": 84, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:45.488Z", 
-        "reservationSet": 3, 
-        "created": "2013-12-18T23:35:45.487Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 85
+        "created": "2013-12-18T23:35:45.487Z", 
+        "reservationSet": 3, 
+        "sliver": 85, 
+        "enacted": null
     }
 },
 {
     "model": "core.reservedresource", 
     "fields": {
         "updated": "2013-12-18T23:35:45.488Z", 
-        "reservationSet": 3, 
-        "created": "2013-12-18T23:35:45.488Z", 
         "resource": 8, 
         "quantity": 1, 
-        "sliver": 86
+        "created": "2013-12-18T23:35:45.488Z", 
+        "reservationSet": 3, 
+        "sliver": 86, 
+        "enacted": null
     }
 },
 {
     "model": "core.networktemplate", 
     "fields": {
         "guaranteedBandwidth": 0, 
-        "description": "Connect a sliver to the public network using dedicated public IPv4 address", 
+        "description": "Connect a sliver to the public network using a dedicated public IPv4 address",
         "created": "2013-12-09T14:15:16.899Z", 
-        "sharedNetworkName": "", 
+        "sharedNetworkName": "ext-net",
         "updated": "2013-12-09T14:15:16.899Z", 
         "visibility": "private", 
+        "name": "Public dedicated IPv4",
         "translation": "none", 
         "sharedNetworkId": "", 
-        "name": "dedicated-public-IPv4"
-    }
-},
-{
-    "pk": 2, 
-    "model": "core.networktemplate", 
-    "fields": {
-        "guaranteedBandwidth": 0, 
-        "description": "For PlanetLab compatibility: connect to the public network by sharing the node's public IP address.", 
-        "created": "2013-12-09T14:16:12.358Z", 
-        "sharedNetworkName": "", 
-        "updated": "2013-12-09T14:16:12.358Z", 
-        "visibility": "public", 
-        "translation": "none", 
-        "sharedNetworkId": "", 
-        "name": "planetlab-legacy"
+        "enacted": null
     }
 },
 {
     "model": "core.networktemplate", 
     "fields": {
         "guaranteedBandwidth": 0, 
-        "description": "Connect a sliver to the public network via NAT", 
+        "description": "Connect a sliver to the public network via NAT, with port forwarding",
         "created": "2013-12-09T14:17:29.551Z", 
         "sharedNetworkName": "nat-net", 
         "updated": "2013-12-09T14:17:29.551Z", 
         "visibility": "private", 
+        "name": "Public shared IPv4",
         "translation": "NAT", 
-        "sharedNetworkId": "51d641ba-9e1e-46f5-8069-bf4a929f851f", 
-        "name": "private-IPv4-plus-NAT"
+        "sharedNetworkId": "",
+        "enacted": null
     }
 },
 {
         "sharedNetworkName": "", 
         "updated": "2013-12-09T14:18:02.336Z", 
         "visibility": "private", 
+        "name": "Private",
         "translation": "none", 
         "sharedNetworkId": "", 
-        "name": "private-virtual"
+        "enacted": null
     }
 },
 {
         "network_id": "7cb4291d-f8d3-4797-83b0-8deefd85bdf5", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "810b4cb8-9d8e-4eee-becc-676785a07725", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "4b37f048-11de-4ddd-acaf-2fc5e8716f0e", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "684386d7-1286-4e58-acda-8ff45deac99e", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "fa090174-ec59-4b7a-812b-9206d911fb61", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "017a3914-5eaf-4bcb-8609-6d17ebcdf075", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "ecdbaf66-b659-4d59-b0b7-1bf6d232ccba", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "ae4d42e8-a97c-440d-9533-4bcbd62dfb00", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 11, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 12, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 13, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 14, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 3, 
         "owner": 15, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 10, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 9, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 9, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 8, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 8, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 4, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 4, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 4, 
         "owner": 6, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
         "network_id": "", 
         "template": 1, 
         "owner": 6, 
-        "ports": ""
+        "ports": "", 
+        "enacted": null
     }
 },
 {
     "pk": 1, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:51:09.711Z", 
         "slice": 11, 
+        "updated": "2013-12-13T21:51:09.711Z", 
+        "enacted": null, 
         "network": 12, 
         "created": "2013-12-13T21:51:09.711Z"
     }
     "pk": 2, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:53:15.909Z", 
         "slice": 12, 
+        "updated": "2013-12-13T21:53:15.909Z", 
+        "enacted": null, 
         "network": 13, 
         "created": "2013-12-13T21:53:15.909Z"
     }
     "pk": 3, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:53:15.914Z", 
         "slice": 12, 
+        "updated": "2013-12-13T21:53:15.914Z", 
+        "enacted": null, 
         "network": 12, 
         "created": "2013-12-13T21:53:15.914Z"
     }
     "pk": 4, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.235Z", 
         "slice": 13, 
+        "updated": "2013-12-13T21:56:04.235Z", 
+        "enacted": null, 
         "network": 14, 
         "created": "2013-12-13T21:56:04.235Z"
     }
     "pk": 5, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.241Z", 
         "slice": 13, 
+        "updated": "2013-12-13T21:56:04.241Z", 
+        "enacted": null, 
         "network": 12, 
         "created": "2013-12-13T21:56:04.241Z"
     }
     "pk": 6, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:56:04.246Z", 
         "slice": 13, 
+        "updated": "2013-12-13T21:56:04.246Z", 
+        "enacted": null, 
         "network": 13, 
         "created": "2013-12-13T21:56:04.246Z"
     }
     "pk": 7, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.826Z", 
         "slice": 14, 
+        "updated": "2013-12-13T21:57:56.826Z", 
+        "enacted": null, 
         "network": 15, 
         "created": "2013-12-13T21:57:56.826Z"
     }
     "pk": 8, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.831Z", 
         "slice": 14, 
+        "updated": "2013-12-13T21:57:56.831Z", 
+        "enacted": null, 
         "network": 13, 
         "created": "2013-12-13T21:57:56.831Z"
     }
     "pk": 9, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T21:57:56.836Z", 
         "slice": 14, 
+        "updated": "2013-12-13T21:57:56.836Z", 
+        "enacted": null, 
         "network": 12, 
         "created": "2013-12-13T21:57:56.836Z"
     }
     "pk": 10, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T22:01:14.038Z", 
         "slice": 15, 
+        "updated": "2013-12-13T22:01:14.038Z", 
+        "enacted": null, 
         "network": 16, 
         "created": "2013-12-13T22:01:14.038Z"
     }
     "pk": 11, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-13T22:01:14.043Z", 
         "slice": 15, 
+        "updated": "2013-12-13T22:01:14.043Z", 
+        "enacted": null, 
         "network": 14, 
         "created": "2013-12-13T22:01:14.043Z"
     }
     "pk": 12, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:06:00.381Z", 
         "slice": 10, 
+        "updated": "2013-12-18T22:06:00.381Z", 
+        "enacted": null, 
         "network": 17, 
         "created": "2013-12-18T22:06:00.381Z"
     }
     "pk": 13, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:06:00.386Z", 
         "slice": 10, 
+        "updated": "2013-12-18T22:06:00.386Z", 
+        "enacted": null, 
         "network": 18, 
         "created": "2013-12-18T22:06:00.386Z"
     }
     "pk": 14, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:13:42.177Z", 
         "slice": 9, 
+        "updated": "2013-12-18T22:13:42.177Z", 
+        "enacted": null, 
         "network": 19, 
         "created": "2013-12-18T22:13:42.177Z"
     }
     "pk": 15, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:13:42.183Z", 
         "slice": 9, 
+        "updated": "2013-12-18T22:13:42.183Z", 
+        "enacted": null, 
         "network": 20, 
         "created": "2013-12-18T22:13:42.183Z"
     }
     "pk": 16, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:16:41.007Z", 
         "slice": 8, 
+        "updated": "2013-12-18T22:16:41.007Z", 
+        "enacted": null, 
         "network": 21, 
         "created": "2013-12-18T22:16:41.007Z"
     }
     "pk": 17, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:16:41.013Z", 
         "slice": 8, 
+        "updated": "2013-12-18T22:16:41.013Z", 
+        "enacted": null, 
         "network": 22, 
         "created": "2013-12-18T22:16:41.013Z"
     }
     "pk": 18, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:24:44.997Z", 
         "slice": 4, 
+        "updated": "2013-12-18T22:24:44.997Z", 
+        "enacted": null, 
         "network": 23, 
         "created": "2013-12-18T22:24:44.997Z"
     }
     "pk": 19, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:24:45.003Z", 
         "slice": 4, 
+        "updated": "2013-12-18T22:24:45.003Z", 
+        "enacted": null, 
         "network": 24, 
         "created": "2013-12-18T22:24:45.003Z"
     }
     "pk": 20, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:27:16.953Z", 
         "slice": 6, 
+        "updated": "2013-12-18T22:27:16.953Z", 
+        "enacted": null, 
         "network": 25, 
         "created": "2013-12-18T22:27:16.953Z"
     }
     "pk": 21, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-18T22:27:16.959Z", 
         "slice": 6, 
+        "updated": "2013-12-18T22:27:16.959Z", 
+        "enacted": null, 
         "network": 26, 
         "created": "2013-12-18T22:27:16.959Z"
     }
     "pk": 22, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-19T00:14:36.949Z", 
         "slice": 6, 
+        "updated": "2013-12-19T00:14:36.949Z", 
+        "enacted": null, 
         "network": 23, 
         "created": "2013-12-19T00:14:36.949Z"
     }
     "pk": 23, 
     "model": "core.networkslice", 
     "fields": {
-        "updated": "2013-12-19T00:15:11.362Z", 
         "slice": 8, 
+        "updated": "2013-12-19T00:15:11.362Z", 
+        "enacted": null, 
         "network": 23, 
         "created": "2013-12-19T00:15:11.362Z"
     }
     "pk": 1, 
     "model": "core.networkparametertype", 
     "fields": {
-        "updated": "2013-12-09T14:43:25.664Z", 
         "description": "End of IPv4 address allocation pool", 
+        "updated": "2013-12-09T14:43:25.664Z", 
+        "enacted": null, 
         "name": "allocation-pool-end", 
         "created": "2013-12-09T14:43:25.664Z"
     }
     "pk": 2, 
     "model": "core.networkparametertype", 
     "fields": {
-        "updated": "2013-12-09T14:43:45.564Z", 
         "description": "Start of IPv4 address allocation pool", 
+        "updated": "2013-12-09T14:43:45.564Z", 
+        "enacted": null, 
         "name": "allocation-pool-start", 
         "created": "2013-12-09T14:43:45.564Z"
     }
     "pk": 3, 
     "model": "core.networkparametertype", 
     "fields": {
-        "updated": "2013-12-09T14:44:05.513Z", 
         "description": "CIDR block for network", 
+        "updated": "2013-12-09T14:44:05.513Z", 
+        "enacted": null, 
         "name": "cidr", 
         "created": "2013-12-09T14:44:05.513Z"
     }
     "model": "core.account", 
     "fields": {
         "updated": "2013-12-18T21:29:00.470Z", 
+        "enacted": null, 
         "site": 10, 
         "created": "2013-12-18T21:29:00.470Z"
     }
     "model": "core.account", 
     "fields": {
         "updated": "2013-12-18T21:29:00.495Z", 
+        "enacted": null, 
         "site": 22, 
         "created": "2013-12-18T21:29:00.495Z"
     }
     "model": "core.account", 
     "fields": {
         "updated": "2013-12-18T21:29:00.502Z", 
+        "enacted": null, 
         "site": 24, 
         "created": "2013-12-18T21:29:00.502Z"
     }
     "fields": {
         "date": "2013-11-18T21:00:00Z", 
         "updated": "2013-12-18T21:29:16.421Z", 
+        "enacted": null, 
         "account": 14, 
         "created": "2013-12-18T21:29:16.421Z"
     }
     "fields": {
         "date": "2013-11-24T21:00:00Z", 
         "updated": "2013-12-18T21:29:16.434Z", 
+        "enacted": null, 
         "account": 14, 
         "created": "2013-12-18T21:29:16.434Z"
     }
     "fields": {
         "date": "2013-12-01T21:00:00Z", 
         "updated": "2013-12-18T21:29:17.229Z", 
+        "enacted": null, 
         "account": 14, 
         "created": "2013-12-18T21:29:17.229Z"
     }
     "fields": {
         "date": "2013-12-08T21:00:00Z", 
         "updated": "2013-12-18T21:29:18.213Z", 
+        "enacted": null, 
         "account": 14, 
         "created": "2013-12-18T21:29:18.212Z"
     }
     "fields": {
         "date": "2013-12-15T21:00:00Z", 
         "updated": "2013-12-18T21:29:19.091Z", 
+        "enacted": null, 
         "account": 14, 
         "created": "2013-12-18T21:29:19.091Z"
     }
     "fields": {
         "date": "2013-11-18T21:00:00Z", 
         "updated": "2013-12-18T21:29:20.175Z", 
+        "enacted": null, 
         "account": 15, 
         "created": "2013-12-18T21:29:20.175Z"
     }
     "fields": {
         "date": "2013-11-24T21:00:00Z", 
         "updated": "2013-12-18T21:29:20.193Z", 
+        "enacted": null, 
         "account": 15, 
         "created": "2013-12-18T21:29:20.193Z"
     }
     "fields": {
         "date": "2013-12-01T21:00:00Z", 
         "updated": "2013-12-18T21:29:22.239Z", 
+        "enacted": null, 
         "account": 15, 
         "created": "2013-12-18T21:29:22.239Z"
     }
     "fields": {
         "date": "2013-12-08T21:00:00Z", 
         "updated": "2013-12-18T21:29:24.550Z", 
+        "enacted": null, 
         "account": 15, 
         "created": "2013-12-18T21:29:24.550Z"
     }
     "fields": {
         "date": "2013-12-15T21:00:00Z", 
         "updated": "2013-12-18T21:29:26.820Z", 
+        "enacted": null, 
         "account": 15, 
         "created": "2013-12-18T21:29:26.820Z"
     }
     "fields": {
         "date": "2013-11-18T21:00:00Z", 
         "updated": "2013-12-18T21:29:29.206Z", 
+        "enacted": null, 
         "account": 16, 
         "created": "2013-12-18T21:29:29.206Z"
     }
     "fields": {
         "date": "2013-11-24T21:00:00Z", 
         "updated": "2013-12-18T21:29:29.222Z", 
+        "enacted": null, 
         "account": 16, 
         "created": "2013-12-18T21:29:29.222Z"
     }
     "fields": {
         "date": "2013-12-01T21:00:00Z", 
         "updated": "2013-12-18T21:29:29.538Z", 
+        "enacted": null, 
         "account": 16, 
         "created": "2013-12-18T21:29:29.538Z"
     }
     "fields": {
         "date": "2013-12-08T21:00:00Z", 
         "updated": "2013-12-18T21:29:29.894Z", 
+        "enacted": null, 
         "account": 16, 
         "created": "2013-12-18T21:29:29.894Z"
     }
     "fields": {
         "date": "2013-12-15T21:00:00Z", 
         "updated": "2013-12-18T21:29:30.251Z", 
+        "enacted": null, 
         "account": 16, 
         "created": "2013-12-18T21:29:30.251Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:00.529Z", 
+        "enacted": null, 
         "name": "node17.washington.vicci.org", 
         "created": "2013-12-18T21:29:00.529Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:01.289Z", 
+        "enacted": null, 
         "name": "node16.washington.vicci.org", 
         "created": "2013-12-18T21:29:01.289Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:02.189Z", 
+        "enacted": null, 
         "name": "node15.washington.vicci.org", 
         "created": "2013-12-18T21:29:02.189Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:03.178Z", 
+        "enacted": null, 
         "name": "node14.washington.vicci.org", 
         "created": "2013-12-18T21:29:03.178Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:03.942Z", 
+        "enacted": null, 
         "name": "node70.princeton.vicci.org", 
         "created": "2013-12-18T21:29:03.942Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:04.702Z", 
+        "enacted": null, 
         "name": "node69.princeton.vicci.org", 
         "created": "2013-12-18T21:29:04.702Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:05.547Z", 
+        "enacted": null, 
         "name": "node68.princeton.vicci.org", 
         "created": "2013-12-18T21:29:05.547Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:06.336Z", 
+        "enacted": null, 
         "name": "node67.princeton.vicci.org", 
         "created": "2013-12-18T21:29:06.336Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:07.101Z", 
+        "enacted": null, 
         "name": "node30.princeton.vicci.org", 
         "created": "2013-12-18T21:29:07.101Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:09.453Z", 
+        "enacted": null, 
         "name": "node55.stanford.vicci.org", 
         "created": "2013-12-18T21:29:09.453Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:10.216Z", 
+        "enacted": null, 
         "name": "node12.princeton.vicci.org", 
         "created": "2013-12-18T21:29:10.216Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:10.975Z", 
+        "enacted": null, 
         "name": "node20.washington.vicci.org", 
         "created": "2013-12-18T21:29:10.975Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:11.729Z", 
+        "enacted": null, 
         "name": "node1.stanford.vicci.org", 
         "created": "2013-12-18T21:29:11.729Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:12.494Z", 
+        "enacted": null, 
         "name": "node33.princeton.vicci.org", 
         "created": "2013-12-18T21:29:12.494Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:13.329Z", 
+        "enacted": null, 
         "name": "node15.princeton.vicci.org", 
         "created": "2013-12-18T21:29:13.329Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:14.083Z", 
+        "enacted": null, 
         "name": "node23.princeton.vicci.org", 
         "created": "2013-12-18T21:29:14.083Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:14.847Z", 
+        "enacted": null, 
         "name": "node10.princeton.vicci.org", 
         "created": "2013-12-18T21:29:14.847Z"
     }
     "model": "core.usableobject", 
     "fields": {
         "updated": "2013-12-18T21:29:15.609Z", 
+        "enacted": null, 
         "name": "node13.princeton.vicci.org", 
         "created": "2013-12-18T21:29:15.609Z"
     }
     "pk": 37, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-03T02:00:00Z", 
-        "amount": 0.2968, 
         "updated": "2013-12-18T21:29:19.973Z", 
+        "created": "2013-12-18T21:29:19.973Z", 
         "account": 14, 
-        "created": "2013-12-18T21:29:19.973Z"
+        "amount": 0.2968, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 38, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-09T02:00:00Z", 
-        "amount": 21.14, 
         "updated": "2013-12-18T21:29:19.979Z", 
+        "created": "2013-12-18T21:29:19.979Z", 
         "account": 14, 
-        "created": "2013-12-18T21:29:19.979Z"
+        "amount": 21.14, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 39, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-16T02:00:00Z", 
-        "amount": 24.3768, 
         "updated": "2013-12-18T21:29:19.987Z", 
+        "created": "2013-12-18T21:29:19.987Z", 
         "account": 14, 
-        "created": "2013-12-18T21:29:19.987Z"
+        "amount": 24.3768, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 40, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-03T02:00:00Z", 
-        "amount": 0.3024, 
         "updated": "2013-12-18T21:29:29.154Z", 
+        "created": "2013-12-18T21:29:29.153Z", 
         "account": 15, 
-        "created": "2013-12-18T21:29:29.153Z"
+        "amount": 0.3024, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 41, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-09T02:00:00Z", 
-        "amount": 86.5536, 
         "updated": "2013-12-18T21:29:29.166Z", 
+        "created": "2013-12-18T21:29:29.166Z", 
         "account": 15, 
-        "created": "2013-12-18T21:29:29.166Z"
+        "amount": 86.5536, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 42, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-16T02:00:00Z", 
-        "amount": 96.404, 
         "updated": "2013-12-18T21:29:29.174Z", 
+        "created": "2013-12-18T21:29:29.174Z", 
         "account": 15, 
-        "created": "2013-12-18T21:29:29.174Z"
+        "amount": 96.404, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 43, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-03T02:00:00Z", 
-        "amount": 0.1848, 
         "updated": "2013-12-18T21:29:30.620Z", 
+        "created": "2013-12-18T21:29:30.620Z", 
         "account": 16, 
-        "created": "2013-12-18T21:29:30.620Z"
+        "amount": 0.1848, 
+        "date": "2013-12-03T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 44, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-09T02:00:00Z", 
-        "amount": 8.5904, 
         "updated": "2013-12-18T21:29:30.626Z", 
+        "created": "2013-12-18T21:29:30.626Z", 
         "account": 16, 
-        "created": "2013-12-18T21:29:30.626Z"
+        "amount": 8.5904, 
+        "date": "2013-12-09T02:00:00Z", 
+        "enacted": null
     }
 },
 {
     "pk": 45, 
     "model": "core.payment", 
     "fields": {
-        "date": "2013-12-16T02:00:00Z", 
-        "amount": 10.0016, 
         "updated": "2013-12-18T21:29:30.634Z", 
+        "created": "2013-12-18T21:29:30.634Z", 
         "account": 16, 
-        "created": "2013-12-18T21:29:30.634Z"
+        "amount": 10.0016, 
+        "date": "2013-12-16T02:00:00Z", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 68, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
     "pk": 60561, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-18T21:29:29.000Z", 
+        "updated": "2013-12-18T21:29:29Z", 
         "slice": 8, 
         "created": "2013-12-18T21:29:07.834Z", 
         "amount": 0.56, 
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-18T21:29:21.130Z", 
         "slice": 9, 
-        "created": "2013-12-18T21:29:08.000Z", 
+        "created": "2013-12-18T21:29:08Z", 
         "amount": 0.56, 
         "object": 112, 
         "account": 15, 
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 73, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 74, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 74, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 74, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 74, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 74, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 74, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 74, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 74, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 74, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 74, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 74, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 74, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 74, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 74, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 74, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 74, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 74, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 74, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 75, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 75, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 75, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 75, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 75, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 75, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 75, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 75, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 75, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 75, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 75, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 75, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 75, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 75, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 75, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 75, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 75, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 75, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 75, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 75, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 75, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 76, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 76, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 76, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 76, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 76, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 76, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 76, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 76, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 76, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 76, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 76, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 76, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 76, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 76, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 76, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 76, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 76, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 76, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 76, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 76, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 76, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 77, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 77, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 77, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 77, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 77, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 77, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 77, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 77, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 77, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 77, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 77, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 77, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 77, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 77, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 77, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 77, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 77, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 74, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 74, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 74, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 74, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 74, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 74, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 74, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 74, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 74, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 74, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 74, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 74, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 74, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 74, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 74, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 74, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 74, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 74, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 74, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 75, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 75, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 75, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 75, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 75, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 75, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 75, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 75, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 75, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 75, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 75, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 75, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 75, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 75, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 75, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 75, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 75, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 75, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 75, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 75, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 75, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 76, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 76, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 76, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 76, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 76, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 76, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 76, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 76, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 76, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 76, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 76, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 76, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 76, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 76, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 76, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 76, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 76, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 76, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 76, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 76, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 76, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 77, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 77, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 77, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 77, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 77, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 77, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 77, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 77, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 77, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 77, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 77, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 77, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 77, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 77, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 77, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 77, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 77, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 77, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 77, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 77, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
     "pk": 60857, 
     "model": "core.charge", 
     "fields": {
-        "updated": "2013-12-18T21:29:22.000Z", 
+        "updated": "2013-12-18T21:29:22Z", 
         "slice": 13, 
         "created": "2013-12-18T21:29:10.361Z", 
         "amount": 0.56, 
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 69, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 70, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 71, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": 72, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 8.0, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "reservation"
+        "kind": "reservation", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 64, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 64, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 64, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 64, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 64, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 64, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 64, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 64, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 64, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 64, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 64, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 64, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 64, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 65, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 65, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 65, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 65, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 65, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 65, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 65, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 65, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 65, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 65, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 65, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 65, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 65, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 65, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 65, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 65, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 65, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 65, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 65, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 66, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 66, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 66, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 66, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 66, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 66, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 66, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 66, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 66, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 66, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 66, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 66, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 66, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 66, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 66, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 66, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 66, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 66, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 66, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 66, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 66, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 67, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 67, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 67, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 67, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 67, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 67, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 67, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 67, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 67, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 67, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 67, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 67, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 67, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 67, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 63, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 64, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 64, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 64, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 64, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 64, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 64, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 64, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 64, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 64, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 64, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 64, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 64, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 64, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 64, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 64, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 65, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 65, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 65, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 65, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 65, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 65, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 65, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 65, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 65, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 65, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 65, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 65, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 65, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 65, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 65, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 65, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 65, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 65, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 65, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 66, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 66, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 66, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 66, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 66, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 66, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 66, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 66, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 66, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 66, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 66, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 66, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 66, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 66, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 66, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 66, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 66, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 66, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 66, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 66, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 66, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 67, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 67, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 67, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 67, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 67, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 67, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 67, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 67, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 67, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 67, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 67, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 67, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 67, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 67, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 67, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 67, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 67, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 64, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 64, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 64, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 64, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 64, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 64, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 64, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 64, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 64, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 64, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 64, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 64, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 64, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 64, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 64, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 65, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 65, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 65, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 65, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 65, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 65, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 65, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 65, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 65, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 65, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 65, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 65, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 65, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 65, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 65, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 65, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 65, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 65, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 66, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 66, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 66, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 66, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 66, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 66, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 66, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 66, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 66, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 66, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 66, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 66, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 66, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 66, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 66, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 66, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 66, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 66, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 66, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 66, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 66, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 67, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 67, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 67, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 67, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.76, 
         "invoice": 67, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 67, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 67, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 67, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 67, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 67, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 67, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 67, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 67, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 67, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 67, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 67, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 67, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 64, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 64, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 64, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 64, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 64, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": 64, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 64, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 64, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 64, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 64, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 64, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 64, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 64, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 64, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 64, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 64, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 64, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 65, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 65, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 65, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 65, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 65, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 65, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.16, 
         "invoice": 65, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 65, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 65, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": 65, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 65, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 65, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 65, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 65, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 65, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 65, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 65, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 65, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 66, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 66, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 66, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 66, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 66, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 66, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 66, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 66, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 66, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 66, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 66, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 66, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 66, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 66, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 66, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 66, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 66, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 66, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 66, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 66, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 66, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 67, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 67, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 67, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 67, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 67, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 67, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 67, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 67, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 67, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 67, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 67, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 67, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 67, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 67, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 67, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 67, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.68, 
         "invoice": 67, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 64, 
         "date": "2013-11-18T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 64, 
         "date": "2013-11-19T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 64, 
         "date": "2013-11-19T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 64, 
         "date": "2013-11-19T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 64, 
         "date": "2013-11-20T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.36, 
         "invoice": 64, 
         "date": "2013-11-20T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 64, 
         "date": "2013-11-20T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 64, 
         "date": "2013-11-21T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 64, 
         "date": "2013-11-21T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.0, 
         "invoice": 64, 
         "date": "2013-11-21T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 64, 
         "date": "2013-11-22T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 64, 
         "date": "2013-11-22T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 64, 
         "date": "2013-11-22T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.72, 
         "invoice": 64, 
         "date": "2013-11-23T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 64, 
         "date": "2013-11-23T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 64, 
         "date": "2013-11-23T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 64, 
         "date": "2013-11-24T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 64, 
         "date": "2013-11-24T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.4, 
         "invoice": 64, 
         "date": "2013-11-24T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 65, 
         "date": "2013-11-25T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 65, 
         "date": "2013-11-25T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.8, 
         "invoice": 65, 
         "date": "2013-11-25T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": 65, 
         "date": "2013-11-26T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 65, 
         "date": "2013-11-26T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 65, 
         "date": "2013-11-26T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.92, 
         "invoice": 65, 
         "date": "2013-11-27T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 65, 
         "date": "2013-11-27T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 65, 
         "date": "2013-11-27T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.84, 
         "invoice": 65, 
         "date": "2013-11-28T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 65, 
         "date": "2013-11-28T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 65, 
         "date": "2013-11-28T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 65, 
         "date": "2013-11-29T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 65, 
         "date": "2013-11-29T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 65, 
         "date": "2013-11-29T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 65, 
         "date": "2013-11-30T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.68, 
         "invoice": 65, 
         "date": "2013-11-30T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": 65, 
         "date": "2013-11-30T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 65, 
         "date": "2013-12-01T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 65, 
         "date": "2013-12-01T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 65, 
         "date": "2013-12-01T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.16, 
         "invoice": 66, 
         "date": "2013-12-02T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 66, 
         "date": "2013-12-02T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 66, 
         "date": "2013-12-02T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 66, 
         "date": "2013-12-03T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 66, 
         "date": "2013-12-03T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": 66, 
         "date": "2013-12-03T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.24, 
         "invoice": 66, 
         "date": "2013-12-04T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 66, 
         "date": "2013-12-04T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 66, 
         "date": "2013-12-04T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.44, 
         "invoice": 66, 
         "date": "2013-12-05T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.52, 
         "invoice": 66, 
         "date": "2013-12-05T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 66, 
         "date": "2013-12-05T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.64, 
         "invoice": 66, 
         "date": "2013-12-06T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 66, 
         "date": "2013-12-06T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.64, 
         "invoice": 66, 
         "date": "2013-12-06T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": 66, 
         "date": "2013-12-07T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 66, 
         "date": "2013-12-07T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 66, 
         "date": "2013-12-07T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 66, 
         "date": "2013-12-08T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 66, 
         "date": "2013-12-08T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.32, 
         "invoice": 66, 
         "date": "2013-12-08T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-09T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-09T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-09T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.12, 
         "invoice": 67, 
         "date": "2013-12-10T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.32, 
         "invoice": 67, 
         "date": "2013-12-10T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.4, 
         "invoice": 67, 
         "date": "2013-12-10T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.24, 
         "invoice": 67, 
         "date": "2013-12-11T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.08, 
         "invoice": 67, 
         "date": "2013-12-11T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.48, 
         "invoice": 67, 
         "date": "2013-12-11T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 67, 
         "date": "2013-12-12T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.84, 
         "invoice": 67, 
         "date": "2013-12-12T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.2, 
         "invoice": 67, 
         "date": "2013-12-12T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.0, 
         "invoice": 67, 
         "date": "2013-12-13T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": 67, 
         "date": "2013-12-13T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.92, 
         "invoice": 67, 
         "date": "2013-12-13T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.96, 
         "invoice": 67, 
         "date": "2013-12-14T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": 67, 
         "date": "2013-12-14T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.28, 
         "invoice": 67, 
         "date": "2013-12-14T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.08, 
         "invoice": 67, 
         "date": "2013-12-15T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.72, 
         "invoice": 67, 
         "date": "2013-12-15T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.88, 
         "invoice": 67, 
         "date": "2013-12-15T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.04, 
         "invoice": null, 
         "date": "2013-12-16T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 4.56, 
         "invoice": null, 
         "date": "2013-12-16T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.76, 
         "invoice": null, 
         "date": "2013-12-16T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.48, 
         "invoice": null, 
         "date": "2013-12-17T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.56, 
         "invoice": null, 
         "date": "2013-12-17T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 1.6, 
         "invoice": null, 
         "date": "2013-12-17T21:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 2.8, 
         "invoice": null, 
         "date": "2013-12-18T05:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
         "coreHours": 3.6, 
         "invoice": null, 
         "date": "2013-12-18T13:00:00Z", 
-        "kind": "besteffort"
+        "kind": "besteffort", 
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-11T18:11:43.757Z", 
         "description": "", 
+        "created": "2013-12-11T18:11:43.757Z", 
         "enabled": true, 
+        "service_provider_id": null, 
         "name": "internet2", 
-        "created": "2013-12-11T18:11:43.757Z"
+        "enacted": null
     }
 },
 {
     "fields": {
         "updated": "2013-12-11T18:13:38.024Z", 
         "description": "", 
+        "created": "2013-12-11T18:11:52.622Z", 
         "enabled": true, 
+        "service_provider_id": null, 
         "name": "Syndicate", 
-        "created": "2013-12-11T18:11:52.622Z"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:17.472Z", 
-        "description": "Peer-to-peer content sharing for Syndicate distributed filesystem", 
+        "name": "Syndicate", 
         "created": "2013-12-11T23:57:17.472Z", 
+        "content_provider_id": null, 
         "serviceProvider": 2, 
+        "description": "Peer-to-peer content sharing for Syndicate distributed filesystem", 
         "enabled": true, 
         "users": [], 
-        "name": "Syndicate"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.586Z", 
-        "description": "Content Provider for Georgia Tech", 
+        "name": "Georgia Tech", 
         "created": "2013-12-11T23:57:20.586Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Georgia Tech", 
         "enabled": true, 
         "users": [], 
-        "name": "Georgia Tech"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.611Z", 
-        "description": "Content Provider for Stanford University", 
+        "name": "Stanford University", 
         "created": "2013-12-11T23:57:20.611Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Stanford University", 
         "enabled": true, 
         "users": [], 
-        "name": "Stanford University"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.636Z", 
-        "description": "Content Provider for University of Washington", 
+        "name": "University of Washington", 
         "created": "2013-12-11T23:57:20.636Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for University of Washington", 
         "enabled": true, 
         "users": [], 
-        "name": "University of Washington"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.660Z", 
-        "description": "Content Provider for Max Planck Institute", 
+        "name": "Max Planck Institute", 
         "created": "2013-12-11T23:57:20.660Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Max Planck Institute", 
         "enabled": true, 
         "users": [], 
-        "name": "Max Planck Institute"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.685Z", 
-        "description": "Content Provider for Princeton University", 
+        "name": "Princeton University", 
         "created": "2013-12-11T23:57:20.685Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Content Provider for Princeton University", 
         "enabled": true, 
         "users": [], 
-        "name": "Princeton University"
+        "enacted": null
     }
 },
 {
     "model": "hpc.contentprovider", 
     "fields": {
         "updated": "2013-12-11T23:57:20.710Z", 
-        "description": "Open Networking Lab", 
+        "name": "ON.LAB", 
         "created": "2013-12-11T23:57:20.710Z", 
+        "content_provider_id": null, 
         "serviceProvider": 1, 
+        "description": "Open Networking Lab", 
         "enabled": true, 
         "users": [], 
-        "name": "ON.LAB"
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.496Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.496Z", 
         "url": "node70.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.503Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.503Z", 
         "url": "node69.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.512Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.512Z", 
         "url": "node68.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.520Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.520Z", 
         "url": "node67.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.528Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.528Z", 
         "url": "node66.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.537Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.537Z", 
         "url": "node65.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.545Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.545Z", 
         "url": "node64.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.553Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.553Z", 
         "url": "node63.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.561Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.561Z", 
         "url": "node62.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.570Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.570Z", 
         "url": "node61.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.578Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.578Z", 
         "url": "node60.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.586Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.586Z", 
         "url": "node59.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.595Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.595Z", 
         "url": "node58.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.603Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.603Z", 
         "url": "node57.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.611Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.611Z", 
         "url": "node56.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.619Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.619Z", 
         "url": "node55.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.628Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.628Z", 
         "url": "node54.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.636Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.636Z", 
         "url": "node53.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.644Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.644Z", 
         "url": "node52.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.653Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.653Z", 
         "url": "node51.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.661Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.661Z", 
         "url": "node50.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.669Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.669Z", 
         "url": "node49.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.677Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.677Z", 
         "url": "node48.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.686Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.686Z", 
         "url": "node47.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.694Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.694Z", 
         "url": "node46.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.702Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.702Z", 
         "url": "node45.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.711Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.711Z", 
         "url": "node44.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.719Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.719Z", 
         "url": "node43.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.727Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.727Z", 
         "url": "node42.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.735Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.735Z", 
         "url": "node41.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.744Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.744Z", 
         "url": "node40.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.752Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.752Z", 
         "url": "node39.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.760Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.760Z", 
         "url": "node38.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.768Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.768Z", 
         "url": "node37.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.777Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.777Z", 
         "url": "node36.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.785Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.785Z", 
         "url": "node35.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.793Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.793Z", 
         "url": "node34.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.802Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.802Z", 
         "url": "node33.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.810Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.810Z", 
         "url": "node32.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.818Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.818Z", 
         "url": "node31.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.826Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.826Z", 
         "url": "node30.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.835Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.835Z", 
         "url": "node29.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.843Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.843Z", 
         "url": "node28.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.851Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.851Z", 
         "url": "node27.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.860Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.860Z", 
         "url": "node26.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.868Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.868Z", 
         "url": "node25.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.876Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.876Z", 
         "url": "node24.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.884Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.884Z", 
         "url": "node23.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.893Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.893Z", 
         "url": "node22.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.901Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.901Z", 
         "url": "node21.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.909Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.909Z", 
         "url": "node20.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.918Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.918Z", 
         "url": "node19.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.926Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.926Z", 
         "url": "node18.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.934Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.934Z", 
         "url": "node17.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.942Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.942Z", 
         "url": "node16.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.951Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.951Z", 
         "url": "node15.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.959Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.959Z", 
         "url": "node14.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.967Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.967Z", 
         "url": "node13.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.975Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.975Z", 
         "url": "node12.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.984Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.984Z", 
         "url": "node11.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:17.992Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:17.992Z", 
         "url": "node10.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18Z", 
         "url": "node9.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.009Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.009Z", 
         "url": "node8.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.017Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.017Z", 
         "url": "node7.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.025Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.025Z", 
         "url": "node6.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.034Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.034Z", 
         "url": "node5.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.042Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.042Z", 
         "url": "node4.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.050Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.050Z", 
         "url": "node3.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.058Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.058Z", 
         "url": "node2.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.067Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.067Z", 
         "url": "node1.stanford.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.084Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.084Z", 
         "url": "node70.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.092Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.092Z", 
         "url": "node69.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.100Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.100Z", 
         "url": "node68.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.108Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.108Z", 
         "url": "node67.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.116Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.116Z", 
         "url": "node66.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.125Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.125Z", 
         "url": "node65.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.133Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.133Z", 
         "url": "node64.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.141Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.141Z", 
         "url": "node63.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.149Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.149Z", 
         "url": "node62.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.158Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.158Z", 
         "url": "node61.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.166Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.166Z", 
         "url": "node60.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.174Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.174Z", 
         "url": "node59.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.183Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.183Z", 
         "url": "node58.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.191Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.191Z", 
         "url": "node57.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.199Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.199Z", 
         "url": "node56.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.208Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.207Z", 
         "url": "node55.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.216Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.216Z", 
         "url": "node54.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.224Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.224Z", 
         "url": "node53.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.238Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.238Z", 
         "url": "node52.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.286Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.286Z", 
         "url": "node51.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.299Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.298Z", 
         "url": "node50.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.307Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.307Z", 
         "url": "node49.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.315Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.315Z", 
         "url": "node48.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.323Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.323Z", 
         "url": "node47.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.332Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.332Z", 
         "url": "node46.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.340Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.340Z", 
         "url": "node45.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.348Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.348Z", 
         "url": "node44.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.357Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.356Z", 
         "url": "node43.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.365Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.365Z", 
         "url": "node42.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.373Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.373Z", 
         "url": "node41.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.381Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.381Z", 
         "url": "node40.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.390Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.390Z", 
         "url": "node39.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.398Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.398Z", 
         "url": "node38.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.406Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.406Z", 
         "url": "node37.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.414Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.414Z", 
         "url": "node36.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.423Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.423Z", 
         "url": "node35.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.431Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.431Z", 
         "url": "node34.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.439Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.439Z", 
         "url": "node33.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.448Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.448Z", 
         "url": "node32.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.456Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.456Z", 
         "url": "node31.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.464Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.464Z", 
         "url": "node30.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.472Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.472Z", 
         "url": "node29.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.481Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.481Z", 
         "url": "node28.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.489Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.489Z", 
         "url": "node27.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.497Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.497Z", 
         "url": "node26.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.506Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.505Z", 
         "url": "node25.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.514Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.514Z", 
         "url": "node24.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.522Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.522Z", 
         "url": "node23.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.530Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.530Z", 
         "url": "node22.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.539Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.539Z", 
         "url": "node21.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.547Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.547Z", 
         "url": "node20.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.555Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.555Z", 
         "url": "node19.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.564Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.563Z", 
         "url": "node18.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.572Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.572Z", 
         "url": "node17.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.580Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.580Z", 
         "url": "node16.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.588Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.588Z", 
         "url": "node15.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.597Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.597Z", 
         "url": "node14.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.605Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.605Z", 
         "url": "node13.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.613Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.613Z", 
         "url": "node12.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.622Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.622Z", 
         "url": "node11.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.630Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.630Z", 
         "url": "node10.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.638Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.638Z", 
         "url": "node9.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.646Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.646Z", 
         "url": "node8.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.655Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.655Z", 
         "url": "node7.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.663Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.663Z", 
         "url": "node6.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.671Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.671Z", 
         "url": "node5.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.680Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.680Z", 
         "url": "node4.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.688Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.688Z", 
         "url": "node3.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.696Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.696Z", 
         "url": "node2.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.704Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.704Z", 
         "url": "node1.washington.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.722Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.722Z", 
         "url": "node70.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.729Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.729Z", 
         "url": "node69.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.738Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.737Z", 
         "url": "node68.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.746Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.746Z", 
         "url": "node67.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.754Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.754Z", 
         "url": "node66.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.762Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.762Z", 
         "url": "node65.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.771Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.771Z", 
         "url": "node64.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.779Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.779Z", 
         "url": "node63.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.787Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.787Z", 
         "url": "node62.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.795Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.795Z", 
         "url": "node61.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.804Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.804Z", 
         "url": "node60.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.812Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.812Z", 
         "url": "node59.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.820Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.820Z", 
         "url": "node58.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.829Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.829Z", 
         "url": "node57.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.837Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.837Z", 
         "url": "node56.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.845Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.845Z", 
         "url": "node55.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.853Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.853Z", 
         "url": "node54.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.862Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.862Z", 
         "url": "node53.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.870Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.870Z", 
         "url": "node52.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.878Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.878Z", 
         "url": "node51.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.887Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.887Z", 
         "url": "node50.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.895Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.895Z", 
         "url": "node49.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.903Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.903Z", 
         "url": "node48.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.911Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.911Z", 
         "url": "node47.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.920Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.920Z", 
         "url": "node46.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.928Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.928Z", 
         "url": "node45.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.936Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.936Z", 
         "url": "node44.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.944Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.944Z", 
         "url": "node43.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.953Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.953Z", 
         "url": "node42.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.961Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.961Z", 
         "url": "node41.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.969Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.969Z", 
         "url": "node40.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.978Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.978Z", 
         "url": "node39.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.986Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.986Z", 
         "url": "node38.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:18.994Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:18.994Z", 
         "url": "node37.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.002Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.002Z", 
         "url": "node36.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.011Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.011Z", 
         "url": "node35.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.019Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.019Z", 
         "url": "node34.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.027Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.027Z", 
         "url": "node33.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.036Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.036Z", 
         "url": "node32.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.044Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.044Z", 
         "url": "node31.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.052Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.052Z", 
         "url": "node30.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.060Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.060Z", 
         "url": "node29.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.069Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.069Z", 
         "url": "node28.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.077Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.077Z", 
         "url": "node27.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.086Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.085Z", 
         "url": "node26.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.094Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.094Z", 
         "url": "node25.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.102Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.102Z", 
         "url": "node24.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.110Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.110Z", 
         "url": "node23.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.118Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.118Z", 
         "url": "node22.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.127Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.127Z", 
         "url": "node21.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.135Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.135Z", 
         "url": "node20.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.143Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.143Z", 
         "url": "node19.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.152Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.152Z", 
         "url": "node18.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.160Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.160Z", 
         "url": "node17.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.168Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.168Z", 
         "url": "node16.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.176Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.176Z", 
         "url": "node15.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.185Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.185Z", 
         "url": "node14.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.193Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.193Z", 
         "url": "node13.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.201Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.201Z", 
         "url": "node12.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.210Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.210Z", 
         "url": "node11.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.218Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.218Z", 
         "url": "node10.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.226Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.226Z", 
         "url": "node9.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.234Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.234Z", 
         "url": "node8.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.243Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.243Z", 
         "url": "node7.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.251Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.251Z", 
         "url": "node6.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.259Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.259Z", 
         "url": "node5.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.268Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.268Z", 
         "url": "node4.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.276Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.276Z", 
         "url": "node3.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.284Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.284Z", 
         "url": "node2.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.292Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.292Z", 
         "url": "node1.princeton.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.310Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.310Z", 
         "url": "node70.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.317Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.317Z", 
         "url": "node69.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.325Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.325Z", 
         "url": "node68.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.334Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.334Z", 
         "url": "node67.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.342Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.342Z", 
         "url": "node66.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.350Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.350Z", 
         "url": "node65.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.359Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.359Z", 
         "url": "node64.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.367Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.367Z", 
         "url": "node63.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.375Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.375Z", 
         "url": "node62.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.383Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.383Z", 
         "url": "node61.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.392Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.392Z", 
         "url": "node60.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.400Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.400Z", 
         "url": "node59.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.408Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.408Z", 
         "url": "node58.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.417Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.416Z", 
         "url": "node57.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.425Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.425Z", 
         "url": "node56.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.433Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.433Z", 
         "url": "node55.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.441Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.441Z", 
         "url": "node54.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.450Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.450Z", 
         "url": "node53.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.458Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.458Z", 
         "url": "node52.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.466Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.466Z", 
         "url": "node51.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.475Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.475Z", 
         "url": "node50.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.483Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.483Z", 
         "url": "node49.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.491Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.491Z", 
         "url": "node48.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.499Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.499Z", 
         "url": "node47.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.508Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.508Z", 
         "url": "node46.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.516Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.516Z", 
         "url": "node45.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.524Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.524Z", 
         "url": "node44.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.533Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.532Z", 
         "url": "node43.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.541Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.541Z", 
         "url": "node42.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.549Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.549Z", 
         "url": "node41.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.557Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.557Z", 
         "url": "node40.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.566Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.566Z", 
         "url": "node39.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.574Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.574Z", 
         "url": "node38.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.582Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.582Z", 
         "url": "node37.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.591Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.590Z", 
         "url": "node36.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.599Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.599Z", 
         "url": "node35.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.607Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.607Z", 
         "url": "node34.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.615Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.615Z", 
         "url": "node33.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.624Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.624Z", 
         "url": "node32.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.632Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.632Z", 
         "url": "node31.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.640Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.640Z", 
         "url": "node30.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.649Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.648Z", 
         "url": "node29.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.657Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.657Z", 
         "url": "node28.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.665Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.665Z", 
         "url": "node27.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.673Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.673Z", 
         "url": "node26.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.682Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.682Z", 
         "url": "node25.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.690Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.690Z", 
         "url": "node24.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.698Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.698Z", 
         "url": "node23.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.706Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.706Z", 
         "url": "node22.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.715Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.715Z", 
         "url": "node21.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.723Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.723Z", 
         "url": "node20.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.731Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.731Z", 
         "url": "node19.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.740Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.740Z", 
         "url": "node18.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.748Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.748Z", 
         "url": "node17.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.756Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.756Z", 
         "url": "node16.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.764Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.764Z", 
         "url": "node15.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.773Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.773Z", 
         "url": "node14.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.781Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.781Z", 
         "url": "node13.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.789Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.789Z", 
         "url": "node12.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.798Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.798Z", 
         "url": "node11.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.806Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.806Z", 
         "url": "node10.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.814Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.814Z", 
         "url": "node9.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.822Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.822Z", 
         "url": "node8.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.831Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.831Z", 
         "url": "node7.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.839Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.839Z", 
         "url": "node6.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.847Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.847Z", 
         "url": "node5.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.856Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.855Z", 
         "url": "node4.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.864Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.864Z", 
         "url": "node3.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.872Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.872Z", 
         "url": "node2.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.880Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.880Z", 
         "url": "node1.gt.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.898Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.898Z", 
         "url": "node70.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.905Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.905Z", 
         "url": "node69.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.913Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.913Z", 
         "url": "node68.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.922Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.922Z", 
         "url": "node67.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.930Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.930Z", 
         "url": "node66.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.938Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.938Z", 
         "url": "node65.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.947Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.947Z", 
         "url": "node64.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.955Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.955Z", 
         "url": "node63.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.963Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.963Z", 
         "url": "node62.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.971Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.971Z", 
         "url": "node61.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.980Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.980Z", 
         "url": "node60.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.988Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.988Z", 
         "url": "node59.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:19.996Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:19.996Z", 
         "url": "node58.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.005Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.005Z", 
         "url": "node57.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.013Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.013Z", 
         "url": "node56.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.021Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.021Z", 
         "url": "node55.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.029Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.029Z", 
         "url": "node54.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.038Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.038Z", 
         "url": "node53.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.046Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.046Z", 
         "url": "node52.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.054Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.054Z", 
         "url": "node51.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.063Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.062Z", 
         "url": "node50.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.071Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.071Z", 
         "url": "node49.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.079Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.079Z", 
         "url": "node48.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.087Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.087Z", 
         "url": "node47.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.096Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.096Z", 
         "url": "node46.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.104Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.104Z", 
         "url": "node45.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.112Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.112Z", 
         "url": "node44.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.121Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.121Z", 
         "url": "node43.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.129Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.129Z", 
         "url": "node42.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.137Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.137Z", 
         "url": "node41.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.146Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.145Z", 
         "url": "node40.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.154Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.154Z", 
         "url": "node39.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.162Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.162Z", 
         "url": "node38.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.170Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.170Z", 
         "url": "node37.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.179Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.179Z", 
         "url": "node36.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.187Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.187Z", 
         "url": "node35.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.195Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.195Z", 
         "url": "node34.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.203Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.203Z", 
         "url": "node33.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.212Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.212Z", 
         "url": "node32.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.220Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.220Z", 
         "url": "node31.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.228Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.228Z", 
         "url": "node30.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.237Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.236Z", 
         "url": "node29.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.245Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.245Z", 
         "url": "node28.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.253Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.253Z", 
         "url": "node27.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.261Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.261Z", 
         "url": "node26.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.270Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.270Z", 
         "url": "node25.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.278Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.278Z", 
         "url": "node24.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.286Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.286Z", 
         "url": "node23.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.294Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.294Z", 
         "url": "node22.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.303Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.303Z", 
         "url": "node21.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.311Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.311Z", 
         "url": "node20.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.319Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.319Z", 
         "url": "node19.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.328Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.328Z", 
         "url": "node18.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.336Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.336Z", 
         "url": "node17.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.344Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.344Z", 
         "url": "node16.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.352Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.352Z", 
         "url": "node15.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.361Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.361Z", 
         "url": "node14.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.369Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.369Z", 
         "url": "node13.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.377Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.377Z", 
         "url": "node12.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.386Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.386Z", 
         "url": "node11.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.394Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.394Z", 
         "url": "node10.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.402Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.402Z", 
         "url": "node9.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.410Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.410Z", 
         "url": "node8.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.419Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.419Z", 
         "url": "node7.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.427Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.427Z", 
         "url": "node6.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.435Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.435Z", 
         "url": "node5.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.443Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.443Z", 
         "url": "node4.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.452Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.452Z", 
         "url": "node3.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.460Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.460Z", 
         "url": "node2.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.468Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "syndicate origin server", 
         "created": "2013-12-11T23:57:20.468Z", 
         "url": "node1.mpisws.vicci.org:32780", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 29
+        "authenticated": false, 
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.594Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.gatech.edu", 
         "created": "2013-12-11T23:57:20.594Z", 
         "url": "www.cs.gatech.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 30
+        "authenticated": false, 
+        "contentProvider": 30, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.619Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.stanford.edu", 
         "created": "2013-12-11T23:57:20.619Z", 
         "url": "www.cs.stanford.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 31
+        "authenticated": false, 
+        "contentProvider": 31, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.644Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.washington.edu", 
         "created": "2013-12-11T23:57:20.644Z", 
         "url": "www.cs.washington.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 32
+        "authenticated": false, 
+        "contentProvider": 32, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.669Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.mpg.de", 
         "created": "2013-12-11T23:57:20.669Z", 
         "url": "www.mpg.de", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 33
+        "authenticated": false, 
+        "contentProvider": 33, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.694Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "Content from www.cs.princeton.edu", 
         "created": "2013-12-11T23:57:20.694Z", 
         "url": "www.cs.princeton.edu", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 34
+        "authenticated": false, 
+        "contentProvider": 34, 
+        "enacted": null
     }
 },
 {
     "model": "hpc.originserver", 
     "fields": {
         "updated": "2013-12-11T23:57:20.719Z", 
-        "authenticated": false
+        "origin_server_id": null
         "description": "onlab virtual machine images", 
         "created": "2013-12-11T23:57:20.719Z", 
         "url": "images.onlab.org", 
         "enabled": true, 
         "redirects": true, 
         "protocol": "http", 
-        "contentProvider": 35
+        "authenticated": false, 
+        "contentProvider": 35, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for the Syndicate distributed filesystem", 
         "created": "2013-12-11T23:57:20.479Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "cdn.syndicatedrive.com", 
         "defaultOriginServer": 3876, 
-        "contentProvider": 29
+        "contentProvider": 29, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Georgia Tech", 
         "created": "2013-12-11T23:57:20.602Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "gt.opencdn.internet2.edu", 
         "defaultOriginServer": 3877, 
-        "contentProvider": 30
+        "contentProvider": 30, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Stanford University", 
         "created": "2013-12-11T23:57:20.627Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "stanford.opencdn.internet2.edu", 
         "defaultOriginServer": 3878, 
-        "contentProvider": 31
+        "contentProvider": 31, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for University of Washington", 
         "created": "2013-12-11T23:57:20.652Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "washington.opencdn.internet2.edu", 
         "defaultOriginServer": 3879, 
-        "contentProvider": 32
+        "contentProvider": 32, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Max Planck Institute", 
         "created": "2013-12-11T23:57:20.677Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "mp.opencdn.internet2.edu", 
         "defaultOriginServer": 3880, 
-        "contentProvider": 33
+        "contentProvider": 33, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for Princeton University", 
         "created": "2013-12-11T23:57:20.702Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "princeton.opencdn.internet2.edu", 
         "defaultOriginServer": 3881, 
-        "contentProvider": 34
+        "contentProvider": 34, 
+        "enacted": null
     }
 },
 {
         "description": "CDN Prefix for ON.LAB", 
         "created": "2013-12-11T23:57:20.727Z", 
         "enabled": true, 
+        "cdn_prefix_id": null, 
         "prefix": "onlab.vicci.org", 
         "defaultOriginServer": 3882, 
-        "contentProvider": 35
-    }
-},
-{
-    "pk": 1, 
-    "model": "core.siteprivilege", 
-    "fields": {
-        "site": 24, 
-        "updated": "2013-12-17T18:08:58.293Z", 
-        "role": 1, 
-        "user": 15, 
-        "created": "2013-12-17T18:08:58.293Z"
+        "contentProvider": 35, 
+        "enacted": null
     }
 },
-
 {
     "pk": 5, 
     "model": "syndicate.syndicateservice", 
 },
 {
     "pk": 1, 
-    "model": "syndicate.syndicateuser", 
-    "fields": {
-        "max_RGs": 100, 
-        "is_admin": true, 
-        "user": 6, 
-        "max_AGs": 100, 
-        "max_UGs": 100, 
-        "max_volumes": 100
-    }
-},
-{
-    "pk": 2, 
-    "model": "syndicate.syndicateuser", 
-    "fields": {
-        "max_RGs": 500, 
-        "is_admin": false, 
-        "user": 13, 
-        "max_AGs": 10, 
-        "max_UGs": 500, 
-        "max_volumes": 1
-    }
-},
-{
-    "pk": 1, 
-    "model": "syndicate.volume", 
-    "fields": {
-        "description": "GenBank dataset snapshot from Nov. 2013", 
-        "blocksize": 61440, 
-        "metadata_private_key": "", 
-        "default_gateway_caps": "3", 
-        "private": false, 
-        "file_quota": -1, 
-        "api_public_key": "", 
-        "owner_id": 1, 
-        "archive": true, 
-        "metadata_public_key": "", 
-        "name": "GenBank-11-2013"
-    }
-},
-{
-    "pk": 2, 
-    "model": "syndicate.volume", 
-    "fields": {
-        "description": "Volume associated with princeton_syndicate", 
-        "blocksize": 102400, 
-        "metadata_private_key": "", 
-        "default_gateway_caps": "31", 
-        "private": true, 
-        "file_quota": 1000000, 
-        "api_public_key": "", 
-        "owner_id": 1, 
-        "archive": false, 
-        "metadata_public_key": "", 
-        "name": "princeton_syndicate-Volume"
-    }
-},
-{
-    "pk": 1, 
-    "model": "syndicate.volumeaccessright", 
-    "fields": {
-        "volume": 1, 
-        "gateway_caps": "3", 
-        "owner_id": 1
-    }
-},
-{
-    "pk": 1, 
-    "model": "syndicate.volumeaccessrequest", 
+    "model": "core.siteprivilege", 
     "fields": {
-        "volume": 2, 
-        "message": "Hi Jude, this is Siobhan.  Can I join the princeton_syndicate volume with read-only permission?\r\n", 
-        "gateway_caps": "3", 
-        "owner_id": 2
+        "updated": "2013-12-17T18:08:58.293Z", 
+        "created": "2013-12-17T18:08:58.293Z", 
+        "site": 24, 
+        "role": 1, 
+        "user": 15, 
+        "enacted": null
     }
 }
 ]
index 6926d90..e31da37 100644 (file)
@@ -6,26 +6,25 @@ from .service import Service
 from .service import ServiceAttribute
 from .tag import Tag
 from .role import Role
-#from .deployment import Deployment
 from .site import Site,Deployment, DeploymentRole, DeploymentPrivilege, SiteDeployments
-from .user import User
+from .dashboard import DashboardView
+from .user import User, UserDeployments, UserDashboardView
 from .serviceclass import ServiceClass
-from .slice import Slice
-from .site import SitePrivilege
-from .image import Image
+from .slice import Slice, SliceDeployments
+from .site import SitePrivilege, SiteDeployments
+from .image import Image, ImageDeployments
 from .node import Node
 from .serviceresource import ServiceResource
 from .slice import SliceRole
 from .slice import SlicePrivilege
 from .site import SiteRole
 from .site import SitePrivilege
-#from .deployment import DeploymentRole
-#from .deployment import DeploymentPrivilege
 from .planetstack import PlanetStackRole
 from .planetstack import PlanetStackPrivilege
 from .slicetag import SliceTag
 from .sliver import Sliver
 from .reservation import ReservedResource
 from .reservation import Reservation
-from .network import Network, NetworkParameterType, NetworkParameter, NetworkSliver, NetworkTemplate, Router, NetworkSlice
+from .network import Network, NetworkParameterType, NetworkParameter, NetworkSliver, NetworkTemplate, Router, NetworkSlice, NetworkDeployments
 from .billing import Account, Invoice, Charge, UsableObject, Payment
+
diff --git a/planetstack/core/models/dashboard.py b/planetstack/core/models/dashboard.py
new file mode 100644 (file)
index 0000000..aa79f84
--- /dev/null
@@ -0,0 +1,11 @@
+import os
+from django.db import models
+from core.models import PlCoreBase
+from django.contrib.contenttypes import generic
+
+class DashboardView(PlCoreBase):
+    name = models.CharField(max_length=200, unique=True, help_text="Name of the View")
+    url = models.CharField(max_length=1024, help_text="URL of Dashboard")
+
+    def __unicode__(self):  return u'%s' % (self.name)
+
diff --git a/planetstack/core/models/deployment.py b/planetstack/core/models/deployment.py
deleted file mode 100644 (file)
index 1e5e6dc..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-import os
-from django.db import models
-from core.models import PlCoreBase
-from django.contrib.contenttypes import generic
-
-# Create your models here.
-
-class ManyToManyField_NoSyncdb(models.ManyToManyField):
-    def __init__(self, *args, **kwargs):
-        super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
-        self.creates_table = False
-
-class Deployment(PlCoreBase):
-    name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
-#    sites = ManyToManyField_NoSyncdb('Site', through=Site.deployments.through, blank=True)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-    
-class DeploymentRole(PlCoreBase):
-
-    ROLE_CHOICES = (('admin','Admin'),)
-    role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
-
-    def __unicode__(self):  return u'%s' % (self.role)
-
-class DeploymentPrivilege(PlCoreBase):
-
-    user = models.ForeignKey('User', related_name='deployment_privileges')
-    deployment = models.ForeignKey('Deployment', related_name='deployment_privileges')
-    role = models.ForeignKey('DeploymentRole')
-
-    def __unicode__(self):  return u'%s %s %s' % (self.deployment, self.user, self.role)
-
index b4803e2..db01e1b 100644 (file)
@@ -1,13 +1,23 @@
 import os
 from django.db import models
 from core.models import PlCoreBase
+from core.models import Deployment
 
 # Create your models here.
 
 class Image(PlCoreBase):
-    image_id = models.CharField(max_length=256, unique=True)
     name = models.CharField(max_length=256, unique=True)
     disk_format = models.CharField(max_length=256)
     container_format = models.CharField(max_length=256)
+    path = models.CharField(max_length=256, null=True, blank=True, help_text="Path to image on local disk")
 
     def __unicode__(self):  return u'%s' % (self.name)
+
+class ImageDeployments(PlCoreBase):
+    image = models.ForeignKey(Image)
+    deployment = models.ForeignKey(Deployment)
+    glance_image_id = models.CharField(null=True, blank=True, max_length=200, help_text="Glance image id") 
+
+    def __unicode__(self):  return u'%s %s' % (self.image, self.deployment)
+
+    
index 72e7a5f..298c54d 100644 (file)
@@ -1,7 +1,7 @@
 import os
 import socket
 from django.db import models
-from core.models import PlCoreBase, Site, Slice, Sliver
+from core.models import PlCoreBase, Site, Slice, Sliver, Deployment
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes import generic
 
@@ -50,6 +50,41 @@ class Network(PlCoreBase):
             self.subnet = find_unused_subnet(existing_subnets=[x.subnet for x in Network.objects.all()])
         super(Network, self).save(*args, **kwds)
 
+    def can_update(self, user):
+        return self.owner.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = Network.objects.all()
+        else:
+            slices = Slice.select_by_user(user)
+            #slice_ids = [s.id for s in Slice.select_by_user(user)]
+            qs = Network.objects.filter(owner__in=slices)
+        return qs
+
+class NetworkDeployments(PlCoreBase):
+    # Stores the openstack ids at various deployments
+    network = models.ForeignKey(Network)    
+    deployment = models.ForeignKey(Deployment)
+    net_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network")
+    router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id")
+    subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id") 
+    subnet = models.CharField(max_length=32, blank=True)    
+       
+    def can_update(self, user):
+        return user.is_admin
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = NetworkDeployments.objects.all()
+        else:
+            slices = Slice.select_by_user(user)
+            networks = Network.objects.filter(owner__in=slices)
+            qs = NetworkDeployments.objects.filter(network__in=networks)
+        return qs      
+
 class NetworkSlice(PlCoreBase):
     # This object exists solely so we can implement the permission check when
     # adding slices to networks. It adds no additional fields to the relation.
@@ -70,6 +105,18 @@ class NetworkSlice(PlCoreBase):
 
     def __unicode__(self):  return u'%s-%s' % (self.network.name, self.slice.name)
 
+    def can_update(self, user):
+        return self.slice.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = NetworkSlice.objects.all()
+        else:
+            slice_ids = [s.id for s in Slice.select_by_user(user)]
+            qs = NetworkSlice.objects.filter(id__in=slice_ids)
+        return qs
+
 class NetworkSliver(PlCoreBase):
     network = models.ForeignKey(Network)
     sliver = models.ForeignKey(Sliver)
@@ -93,6 +140,18 @@ class NetworkSliver(PlCoreBase):
 
     def __unicode__(self):  return u'%s-%s' % (self.network.name, self.sliver.instance_name)
 
+    def can_update(self, user):
+        return self.sliver.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = NetworkSliver.objects.all()
+        else:
+            sliver_ids = [s.id for s in NetworkSliver.select_by_user(user)]
+            qs = NetworkSliver.objects.filter(id__in=sliver_ids)
+        return qs
+
 class Router(PlCoreBase):
     name = models.CharField(max_length=32)
     owner = models.ForeignKey(Slice, related_name="routers")
index 590e240..ec79419 100644 (file)
@@ -1,15 +1,30 @@
+import datetime
 import os
+import sys
 from django.db import models
 from django.forms.models import model_to_dict
 from django.core.urlresolvers import reverse
 from django.forms.models import model_to_dict
-# This is a no-op if observer_disabled is set to 1 in the config file
-from observer import *
+
+try:
+    # This is a no-op if observer_disabled is set to 1 in the config file
+    from observer import *
+except:
+    print >> sys.stderr, "import of observer failed! printing traceback and disabling observer:"
+    import traceback
+    traceback.print_exc()
+
+    # guard against something failing
+    def notify_observer(*args, **kwargs):
+        pass
 
 class PlCoreBase(models.Model):
 
-    created = models.DateTimeField(auto_now_add=True)
-    updated = models.DateTimeField(auto_now=True)
+    # default values for created and updated are only there to keep evolution
+    # from failing.
+
+    created = models.DateTimeField(auto_now_add=True, default=datetime.datetime.now())
+    updated = models.DateTimeField(auto_now=True, default=datetime.datetime.now())
     enacted = models.DateTimeField(null=True, default=None)
 
     class Meta:
@@ -38,6 +53,13 @@ class PlCoreBase(models.Model):
     def get_field_diff(self, field_name):
         return self.diff.get(field_name, None)
 
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        return False
+
     def delete(self, *args, **kwds):
         # so we have something to give the observer
         pk = self.pk
@@ -59,6 +81,14 @@ class PlCoreBase(models.Model):
 
         self.__initial = self._dict
 
+    def save_by_user(self, user, *args, **kwds):
+        if self.can_update(user):
+            self.save(*args, **kwds)
+
+    def delete_by_user(self, user, *args, **kwds):
+        if self.can_update(user):
+            self.delete(*args, **kwds)
+
     @property
     def _dict(self):
         return model_to_dict(self, fields=[field.name for field in
index e445228..db3769f 100644 (file)
@@ -19,6 +19,18 @@ class Reservation(PlCoreBase):
     def endTime(self):
         return self.startTime + datetime.timedelta(hours=self.duration)
 
+    def can_update(self, user):
+        return self.slice.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = Reservation.objects.all()
+        else:
+            slice_ids = [s.id for s in Slice.select_by_user(user)]
+            qs = Reservation.objects.filter(id__in=slice_ids)
+        return qs
+
 class ReservedResource(PlCoreBase):
     sliver = models.ForeignKey(Sliver, related_name="reservedResourrces")
     resource = models.ForeignKey(ServiceResource, related_name="reservedResources")
@@ -30,6 +42,16 @@ class ReservedResource(PlCoreBase):
 
     def __unicode__(self):  return u'%d %s on %s' % (self.quantity, self.resource, self.sliver)
 
-
+    def can_update(self, user):
+        return self.sliver.slice.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = ReservedResource.objects.all()
+        else:
+            sliver_ids = [s.id for s in Sliver.select_by_user(user)]
+            qs = ReservedResource.objects.filter(id__in=sliver_ids)
+        return qs
 
 
index ce3eaee..3b6ee82 100644 (file)
@@ -27,4 +27,6 @@ class ServiceClass(PlCoreBase):
         except ServiceClass.DoesNotExist:
             return None
 
-
+    def save_by_user(self, user, *args, **kwds):
+        if self.can_update(user):
+            super(ServiceClass, self).save(*args, **kwds)
index 65d965b..eea62fe 100644 (file)
@@ -1,16 +1,15 @@
 import os
 from django.db import models
 from core.models import PlCoreBase
-#from core.models import Deployment
 from core.models import Tag
 from django.contrib.contenttypes import generic
 from geoposition.fields import GeopositionField
+from core.acl import AccessControlList
 
 class Site(PlCoreBase):
     """
         A logical grouping of Nodes that are co-located at the same geographic location, which also typically corresponds to the Nodes' location in the physical network.
     """
-    tenant_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone tenant id")
     name = models.CharField(max_length=200, help_text="Name for this Site")
     site_url = models.URLField(null=True, blank=True, max_length=512, help_text="Site's Home URL Page")
     enabled = models.BooleanField(default=True, help_text="Status for this Site")
@@ -21,12 +20,34 @@ class Site(PlCoreBase):
     is_public = models.BooleanField(default=True, help_text="Indicates the visibility of this site to other members")
     abbreviated_name = models.CharField(max_length=80)
 
-    deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
-    #deployments = models.ManyToManyField('Deployment', through='SiteDeployments', blank=True)
+    #deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
+    deployments = models.ManyToManyField('Deployment', through='SiteDeployments', blank=True, help_text="Select which sites are allowed to host nodes in this deployment")
     tags = generic.GenericRelation(Tag)
 
     def __unicode__(self):  return u'%s' % (self.name)
 
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        site_privs = SitePrivilege.objects.filter(user=user, site=self)
+        for site_priv in site_privs:
+            if site_priv.role.role == 'pi':
+                return True
+        return False 
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = Site.objects.all()
+        else:
+            site_ids = [sp.site.id for sp in SitePrivilege.objects.filter(user=user)]
+            site_ids.append(user.site.id)
+            qs = Site.objects.filter(id__in=site_ids)
+        return qs
+
+
 class SiteRole(PlCoreBase):
 
     ROLE_CHOICES = (('admin','Admin'),('pi','PI'),('tech','Tech'),('billing','Billing'))
@@ -48,12 +69,68 @@ class SitePrivilege(PlCoreBase):
     def delete(self, *args, **kwds):
         super(SitePrivilege, self).delete(*args, **kwds)
 
+    def can_update(self, user):
+        return self.site.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = SitePrivilege.objects.all()
+        else:
+            sp_ids = [sp.id for sp in SitePrivilege.objects.filter(user=user)]
+            qs = SitePrivilege.objects.filter(id__in=sp_ids)
+        return qs
+
 class Deployment(PlCoreBase):
     name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
-    #sites = models.ManyToManyField('Site', through='SiteDeployments', blank=True)
+    admin_user = models.CharField(max_length=200, null=True, blank=True, help_text="Username of an admin user at this deployment")
+    admin_password = models.CharField(max_length=200, null=True, blank=True, help_text="Password of theadmin user at this deployment")\r
+    admin_tenant = models.CharField(max_length=200, null=True, blank=True, help_text="Name of the tenant the admin user belongs to")\r
+    auth_url = models.CharField(max_length=200, null=True, blank=True, help_text="Auth url for the deployment")
+
+    # smbaker: the default of 'allow all' is intended for evolutions of existing
+    #    deployments. When new deployments are created via the GUI, they are
+    #    given a default of 'allow site <site_of_creator>'
+    accessControl = models.TextField(max_length=200, blank=False, null=False, default="allow all",
+                                     help_text="Access control list that specifies which sites/users may use nodes in this deployment")
+
+    def get_acl(self):
+        return AccessControlList(self.accessControl)
+
+    def test_acl(self, slice=None, user=None):
+        potential_users=[]
+
+        if user:
+            potential_users.append(user)
+
+        if slice:
+            potential_users.append(slice.creator)
+            for priv in slice.slice_privileges.all():
+                if priv.user not in potential_users:
+                    potential_users.append(priv.user)
+
+        acl = self.get_acl()
+        for user in potential_users:
+            if acl.test(user) == "allow":
+                return True
+
+        return False
+
+    @staticmethod
+    def select_by_acl(user):
+        ids = []
+        for deployment in Deployment.objects.all():
+            acl = deployment.get_acl()
+            if acl.test(user) == "allow":
+                ids.append(deployment.id)
+
+        return Deployment.objects.filter(id__in=ids)
 
     def __unicode__(self):  return u'%s' % (self.name)
 
+    @staticmethod
+    def select_by_user(user):
+        return Deployment.objects.all()
 
 class DeploymentRole(PlCoreBase):
 
@@ -70,11 +147,36 @@ class DeploymentPrivilege(PlCoreBase):
 
     def __unicode__(self):  return u'%s %s %s' % (self.deployment, self.user, self.role)
 
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        dprivs = DeploymentPrivilege.objects.filter(user=user)
+        for dpriv in dprivs:
+            if dpriv.role.role == 'admin':
+                return True
+        return False
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = DeploymentPrivilege.objects.all()
+        else:
+            dpriv_ids = [dp.id for dp in DeploymentPrivilege.objects.filter(user=user)]
+            qs = DeploymentPrivilege.objects.filter(id__in=dpriv_ids)
+        return qs 
+
 class SiteDeployments(PlCoreBase):
     site = models.ForeignKey(Site)
     deployment = models.ForeignKey(Deployment)
+    tenant_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone tenant id")    
+
+    @staticmethod
+    def select_by_user(user):
+        return SiteDeployments.objects.all()
 
-    class Meta:
-        db_table = 'site_deployments'
-        #auto_created = Site
+    #class Meta:
+    #    db_table = 'core_site_deployments'
+    #    #auto_created = Site
 
index 1fa342a..bd41f87 100644 (file)
@@ -9,22 +9,22 @@ from core.models import ServiceClass
 from core.models import Tag
 from django.contrib.contenttypes import generic
 from core.models import Service
+from core.models import Deployment
 
 # Create your models here.
 
 class Slice(PlCoreBase):
-    tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
     name = models.CharField(unique=True, help_text="The Name of the Slice", max_length=80)
     enabled = models.BooleanField(default=True, help_text="Status for this Slice")
     omf_friendly = models.BooleanField()
     description=models.TextField(blank=True,help_text="High level description of the slice and expected activities", max_length=1024)
     slice_url = models.URLField(blank=True, max_length=512)
     site = models.ForeignKey(Site, related_name='slices', help_text="The Site this Slice belongs to")
-    network_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network")
-    router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id")
-    subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id")
+    max_slivers = models.IntegerField(default=10) 
+    imagePreference = models.CharField(default="Ubuntu 12.04 LTS", null=True, blank=True, max_length=256)
     service = models.ForeignKey(Service, related_name='service', null=True, blank=True)
-
+    network = models.CharField(default="Private Only",null=True, blank=True, max_length=256)
+    mountDataSets = models.CharField(default="GenBank",null=True, blank=True, max_length=256)
     tags = generic.GenericRelation(Tag)
 
     serviceClass = models.ForeignKey(ServiceClass, related_name = "slices", null=True, default=ServiceClass.get_default)
@@ -42,6 +42,26 @@ class Slice(PlCoreBase):
             self.creator = self.caller
         super(Slice, self).save(*args, **kwds)
 
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        slice_privs = SlicePrivilege.objects.filter(user=user, slice=self)
+        for slice_priv in slice_privs:
+            if slice_priv.role.role == 'admin':
+                return True
+        return False
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = Slice.objects.all()
+        else:
+            slice_ids = [sp.slice.id for sp in SlicePrivilege.objects.filter(user=user)]
+            qs = Slice.objects.filter(id__in=slice_ids)
+        return qs
+
 class SliceRole(PlCoreBase):
     ROLE_CHOICES = (('admin','Admin'),('default','Default'))
 
@@ -55,3 +75,34 @@ class SlicePrivilege(PlCoreBase):
     role = models.ForeignKey('SliceRole')
 
     def __unicode__(self):  return u'%s %s %s' % (self.slice, self.user, self.role)
+
+    def can_update(self, user):
+        return self.slice.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = SlicePrivilege.objects.all()
+        else:
+            sp_ids = [sp.id for sp in SlicePrivilege.objects.filter(user=user)]
+            qs = SlicePrivilege.objects.filter(id__in=sp_ids)
+        return qs
+
+class SliceDeployments(PlCoreBase):
+    slice = models.ForeignKey(Slice)
+    deployment = models.ForeignKey(Deployment)
+    tenant_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone tenant id")
+    network_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network")
+    router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id")
+    subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id")
+
+    def __unicode__(self):  return u'%s %s'  % (self.slice, self.deployment)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = SliceDeployments.objects.all()
+        else:
+            slices = Slice.select_by_user(user)
+            qs = SliceDeployments.objects.filter(slice__in=slices)
+        return qs    
index 76cc669..ea1d026 100644 (file)
@@ -10,5 +10,14 @@ class SliceTag(PlCoreBase):
     name = models.CharField(help_text="The name of this tag", max_length=30, choices=NAME_CHOICES)
     value = models.CharField(help_text="The value of this tag", max_length=1024)
 
+    def can_update(self, user):
+        return self.slice.can_update(user)
 
-
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = SliceTag.objects.all()
+        else:
+            st_ids = [st.id for st in SliceTag.objects.filter(user=user)]
+            qs = SliceTag.objects.filter(id__in=st_ids)
+        return qs
index 9c00cee..0f37bc9 100644 (file)
@@ -25,6 +25,7 @@ class Sliver(PlCoreBase):
     deploymentNetwork = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deploymentNetwork')
     numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0)
     tags = generic.GenericRelation(Tag)
+    userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation")
 
     def __unicode__(self):
         if self.instance_name:
@@ -36,10 +37,26 @@ class Sliver(PlCoreBase):
         else:
             return u'unsaved-sliver'
 
-
     def save(self, *args, **kwds):
         if not self.name:
             self.name = self.slice.name
         if not self.creator and hasattr(self, 'caller'):
             self.creator = self.caller
+        self.deploymentNetwork = self.node.deployment
+
+        if not self.deploymentNetwork.test_acl(slice=self.slice):
+            raise exceptions.ValidationError("Deployment %s's ACL does not allow any of this slice %s's users" % (self.deploymentNetwork.name, self.slice.name))
+
         super(Sliver, self).save(*args, **kwds)
+
+    def can_update(self, user):
+        return self.slice.can_update(user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = Sliver.objects.all()
+        else:
+            slices = Slice.select_by_user(user)
+            qs = Sliver.objects.filter(slice__in=slices)
+        return qs
index cbe63a5..7818c32 100644 (file)
@@ -22,3 +22,12 @@ class Tag(PlCoreBase):
     def __unicode__(self):
         return self.name
 
+
+    def can_update(self, user):
+        if user.is_admin:
+            return True
+        return False
+
+    @staticmethod
+    def select_by_user(user):
+        return Tag.objects.all()
index a3b82d8..6e7eef6 100644 (file)
@@ -2,9 +2,12 @@ import os
 import datetime
 from collections import defaultdict
 from django.db import models
-from core.models import PlCoreBase,Site
+from django.db.models import F, Q
+from core.models import PlCoreBase,Site, DashboardView
+from core.models.deployment import Deployment
 from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
 from timezones.fields import TimeZoneField
+from operator import itemgetter, attrgetter
 
 # Create your models here.
 class UserManager(BaseUserManager):
@@ -56,8 +59,6 @@ class User(AbstractBaseUser):
 
     username = models.CharField(max_length=255, default="Something" )
 
-
-    kuser_id = models.CharField(null=True, blank=True, help_text="keystone user id", max_length=200) 
     firstname = models.CharField(help_text="person's given name", max_length=200)
     lastname = models.CharField(help_text="person's surname", max_length=200)
 
@@ -77,6 +78,8 @@ class User(AbstractBaseUser):
 
     timezone = TimeZoneField()
 
+    dashboards = models.ManyToManyField('DashboardView', through='UserDashboardView', blank=True)
+
     objects = UserManager()
 
     USERNAME_FIELD = 'email'
@@ -113,6 +116,20 @@ class User(AbstractBaseUser):
     def is_superuser(self):
         return False
 
+    def get_dashboards(self):
+        DEFAULT_DASHBOARDS=["Tenant"]
+
+        dashboards = sorted(list(self.dashboardViews.all()), key=attrgetter('order'))
+        dashboards = [x.dashboardView for x in dashboards]
+
+        if not dashboards:
+            for dashboardName in DEFAULT_DASHBOARDS:
+                dbv = DashboardView.objects.filter(name=dashboardName)
+                if dbv:
+                    dashboards.append(dbv[0])
+
+        return dashboards
+
 #    def get_roles(self):
 #        from core.models.site import SitePrivilege
 #        from core.models.slice import SliceMembership
@@ -130,4 +147,42 @@ class User(AbstractBaseUser):
         if not self.id:
             self.set_password(self.password)    
         self.username = self.email
-        super(User, self).save(*args, **kwds)   
+        super(User, self).save(*args, **kwds)  
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = User.objects.all()
+        else:
+            # can see all users at any site where this user has pi role
+            from core.models.site import SitePrivilege
+            site_privs = SitePrivilege.objects.filter(user=user)
+            sites = [sp.site for sp in site_privs if sp.role.role == 'pi']
+            # get site privs of users at these sites
+            site_privs = SitePrivilege.objects.filter(site__in=sites)
+            user_ids = [sp.user.id for sp in site_privs] + [user.id] 
+            qs = User.objects.filter(Q(site__in=sites) | Q(id__in=user_ids))
+        return qs            
+
+             
+    
+class UserDeployments(PlCoreBase):
+    user = models.ForeignKey(User)
+    deployment = models.ForeignKey(Deployment)
+    kuser_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone user id")
+
+    def __unicode__(self):  return u'%s %s' % (self.user, self.deployment.name)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = UserDeployments.objects.all()
+        else:
+            users = Users.select_by_user(user)
+            qs = Usereployments.objects.filter(user__in=slices)
+        return qs
+
+class UserDashboardView(PlCoreBase):
+     user = models.ForeignKey(User, related_name="dashboardViews")
+     dashboardView = models.ForeignKey(DashboardView, related_name="dashboardViews")
+     order = models.IntegerField(default=0)
diff --git a/planetstack/core/plus/sites.py b/planetstack/core/plus/sites.py
deleted file mode 100644 (file)
index da86a10..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#sites.py
-
-from django.contrib.admin.sites import AdminSite
-
-
-class AdminMixin(object):
-    """Mixin for AdminSite to allow custom dashboard views."""
-
-    def __init__(self, *args, **kwargs):
-        return super(AdminMixin, self).__init__(*args, **kwargs)
-
-    def get_urls(self):
-        """Add our dashboard view to the admin urlconf. Deleted the default index."""
-        from django.conf.urls import patterns, url
-        from views import DashboardWelcomeView
-
-        urls = super(AdminMixin, self).get_urls()
-        del urls[0]
-        custom_url = patterns('',
-               url(r'^$', self.admin_view(DashboardWelcomeView.as_view()), 
-                    name="index")
-        )
-
-        return custom_url + urls
-
-
-class SitePlus(AdminMixin, AdminSite):
-    """
-    A Django AdminSite with the AdminMixin to allow registering custom
-    dashboard view.
-    """
diff --git a/planetstack/core/plus/views.py b/planetstack/core/plus/views.py
deleted file mode 100644 (file)
index 386f6b5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#views.py
-from django.views.generic import TemplateView
-
-from core.models import Slice,SliceRole,SlicePrivilege,Site,Reservation
-
-class DashboardWelcomeView(TemplateView):
-    template_name = 'admin/dashboard/welcome.html'
-
-    def get(self, request, *args, **kwargs):
-        context = self.get_context_data(**kwargs)
-        sliceList = Slice.objects.all()
-        try:
-            site = Site.objects.filter(id=request.user.site.id)
-        except:
-            site = Site.objects.filter(name="Princeton")
-        context['site'] = site[0]
-
-        slicePrivs = SlicePrivilege.objects.filter(user=request.user)
-        userSliceInfo = []
-        for entry in slicePrivs:
-
-            try:
-                reservationList = Reservation.objects.filter(slice=entry.slice)
-                reservations = (True,reservationList)
-
-            except:
-                reservations = None
-
-            userSliceInfo.append({'slice': Slice.objects.get(id=entry.slice.id),
-                               'role': SliceRole.objects.get(id=entry.role.id).role,
-                               'reservations': reservations})
-
-        context['userSliceInfo'] = userSliceInfo
-        return self.render_to_response(context=context)
index b83157b..3fb726d 100644 (file)
@@ -124,6 +124,9 @@ class SliceSerializer(serializers.HyperlinkedModelSerializer):
                   'network_id',
                   'router_id',
                   'subnet_id',
+                  'imagePreference',
+                 'network',
+                 'mountDataSets',
                   'site',
                   'slivers',
                   'updated',
diff --git a/planetstack/core/static/chartsBg.jpg b/planetstack/core/static/chartsBg.jpg
new file mode 100644 (file)
index 0000000..386614f
Binary files /dev/null and b/planetstack/core/static/chartsBg.jpg differ
diff --git a/planetstack/core/static/hpc_historical.css b/planetstack/core/static/hpc_historical.css
new file mode 100644 (file)
index 0000000..7be52db
--- /dev/null
@@ -0,0 +1,50 @@
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  content: " ";
+}
+
+.row:after {
+  clear: both;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  content: " ";
+}
+
+.row:after {
+  clear: both;
+}
+
+.graph_container {
+  width: 800px;
+}
+
+.col-md-halfgraph,
+.col-md-fullgraph {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+.col-md-halfgraph,
+.col-md-fullgraph {
+  float: left;
+}
+.col-md-halfgraph {
+  width: 350px;
+}
+.col-md-fullgraph {
+  width: 700px;
+}
+.col-md-12 {
+  width: 100%;
+}
diff --git a/planetstack/core/static/img/bg_left_white.gif b/planetstack/core/static/img/bg_left_white.gif
new file mode 100644 (file)
index 0000000..7407236
Binary files /dev/null and b/planetstack/core/static/img/bg_left_white.gif differ
diff --git a/planetstack/core/static/js/Leaflet.MakiMarkers.js b/planetstack/core/static/js/Leaflet.MakiMarkers.js
new file mode 100644 (file)
index 0000000..910bb31
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Leaflet plugin to create map icons using Maki Icons from MapBox.
+ *
+ * References:
+ *   Maki Icons: https://www.mapbox.com/maki/
+ *   MapBox Marker API: https://www.mapbox.com/developers/api/#Stand-alone.markers
+ *
+ * Usage:
+ *   var icon = L.MakiMarkers.icon({icon: "rocket", color: "#b0b", size: "m"});
+ *
+ * License:
+ *   MIT: http://jseppi.mit-license.org/
+ */
+(function () {
+  "use strict";
+  L.MakiMarkers = {
+    // Available Maki Icons
+    icons: ["circle-stroked", "circle", "square-stroked", "square",
+      "triangle-stroked", "triangle", "star-stroked", "star", "cross",
+      "marker-stroked", "marker", "religious-jewish", "religious-christian",
+      "religious-muslim", "cemetery", "rocket", "airport", "heliport", "rail",
+      "rail-metro", "rail-light", "bus", "fuel", "parking", "parking-garage",
+      "airfield", "roadblock", "ferry", "harbor", "bicycle", "park", "park2",
+      "museum", "lodging", "monument", "zoo", "garden", "campsite", "theatre",
+      "art-gallery", "pitch", "soccer", "america-football", "tennis", "basketball",
+      "baseball", "golf", "swimming", "cricket", "skiing", "school", "college",
+      "library", "post", "fire-station", "town-hall", "police", "prison",
+      "embassy", "beer", "restaurant", "cafe", "shop", "fast-food", "bar", "bank",
+      "grocery", "cinema", "pharmacy", "hospital", "danger", "industrial",
+      "warehouse", "commercial", "building", "place-of-worship", "alcohol-shop",
+      "logging", "oil-well", "slaughterhouse", "dam", "water", "wetland",
+      "disability", "telephone", "emergency-telephone", "toilets", "waste-basket",
+      "music", "land-use", "city", "town", "village", "farm", "bakery", "dog-park",
+      "lighthouse", "clothing-store", "polling-place", "playground", "entrance",
+      "heart", "london-underground", "minefield", "rail-underground", "rail-above",
+      "camera", "laundry", "car", "suitcase", "hairdresser", "chemist"],
+    defaultColor: "#0a0",
+    defaultIcon: "circle-stroked",
+    defaultSize: "m",
+    apiUrl: "https://api.tiles.mapbox.com/v3/marker/",
+    smallOptions: {
+      iconSize: [20, 50],
+      popupAnchor: [0,-20]
+    },
+    mediumOptions: {
+      iconSize: [30,70],
+      popupAnchor: [0,-30]
+    },
+    largeOptions: {
+      iconSize: [36,90],
+      popupAnchor: [0,-40]
+    }
+  };
+
+  L.MakiMarkers.Icon = L.Icon.extend({
+    options: {
+      //Maki icon: any from https://www.mapbox.com/maki/ (ref: L.MakiMarkers.icons)
+      icon: L.MakiMarkers.defaultIcon,
+      //Marker color: short or long form hex color code
+      color: L.MakiMarkers.defaultColor,
+      //Marker size: "s" (small), "m" (medium), or "l" (large)
+      size: L.MakiMarkers.defaultSize,
+      shadowAnchor: null,
+      shadowSize: null,
+      shadowUrl: null,
+      className: 'maki-marker'
+    },
+
+    initialize: function(options) {
+      var pin;
+
+      options = L.setOptions(this, options);
+
+      switch (options.size) {
+        case "s":
+          L.extend(options, L.MakiMarkers.smallOptions);
+          break;
+        case "l":
+          L.extend(options, L.MakiMarkers.largeOptions);
+          break;
+        default:
+          options.size = "m";
+          L.extend(options, L.MakiMarkers.mediumOptions);
+          break;
+      }
+
+      if (options.color.charAt(0) === '#') {
+        options.color = options.color.substr(1);
+      }
+
+      pin = "pin-" + options.size + "-" + options.icon + "+" +
+        options.color + ".png";
+
+      options.iconUrl = "" + L.MakiMarkers.apiUrl + pin;
+    }
+  });
+
+  L.MakiMarkers.icon = function(options) {
+    return new L.MakiMarkers.Icon(options);
+  };
+})();
diff --git a/planetstack/core/static/log4javascript-1.4.6/changelog.txt b/planetstack/core/static/log4javascript-1.4.6/changelog.txt
new file mode 100644 (file)
index 0000000..fe10b97
--- /dev/null
@@ -0,0 +1,379 @@
+log4javascript change log\r
+-------------------------\r
+\r
+1.4.6 (19/3/2013)\r
+- Added fix to handle 1223 status code from XMLHttpRequest in IE\r
+\r
+1.4.5 (20/2/2013)\r
+- Changed AjaxAppender to send raw data rather than URL-encoded form data when\r
+  content-type is not "application/x-www-form-urlencoded"\r
+\r
+- Exposed sendAllRemaining() method of AjaxAppender\r
+\r
+1.4.4 (8/2/2013)\r
+- Fixed issue with repeated Content-Type headers in AjaxAppender\r
+\r
+- Improved uniqueness of PopUpAppender window name\r
+\r
+1.4.3 (18/9/2012)\r
+- Added addHeader() and getHeaders() methods to AjaxAppender\r
+\r
+- Modified sendAllOnUnload feature of AjaxAppender. It now works in WebKit but\r
+  at the expense of popping up a confirm dialog. That being the case, it is now\r
+  disabled by default.\r
+\r
+- Removed leaked global variable "initialized" \r
+\r
+- Fixed bugs #3528265, #3560924, #3560922, #2805479, #3510639 on Sourceforge\r
+  Tracker\r
+\r
+\r
+1.4.2 (13/10/2011)\r
+- Fixed JsonLayout trailing comma issue. See\r
+  http://stackoverflow.com/questions/7735382/asmx-weirdness-deserializing-json-\r
+  blob-from-log4javascript-logging\r
+\r
+- Fixed bugs #3401332, #3185753, #2884623, #2817213 on Sourceforge Tracker\r
+\r
+\r
+1.4.1 (23/3/2009)\r
+- Fixed document.domain/query string bug (#2519903 on Sourceforge Tracker)\r
+\r
+- Added isVisible() method to PopUpAppender\r
+\r
+- Added check for whether the console has been closed in isVisible() method of\r
+  InPageAppender\r
+\r
+- Included unit tests in the distribution\r
+\r
+\r
+1.4 (30/10/2008)\r
+\r
+- Added time() and timeEnd() methods to Logger\r
+\r
+- Added group() and groupEnd() methods to Logger and support for displaying\r
+  expandable groups to InPageAppender and PopUpAppender\r
+\r
+- Added facility to layout custom fields. A custom field value may now\r
+  optionally be a function which is passed a reference to the layout and a\r
+  logging event and run at the time the layout's format method is called\r
+\r
+- Added option to XmlLayout and JsonLayout to allow multiple messages to be\r
+  formatted either as one combined message or multiple messages\r
+\r
+- Added code to set log4javascript as a property of the window object. This\r
+  ensures that if log4javascript is loaded via eval() (e.g. Dojo's module\r
+  loading system), the log4javascript object is guaranteed to be available even\r
+  though IE does not evaluate the script in the global scope\r
+\r
+- Added useDocumentWrite parameter to constructors and isUseDocumentWrite()\r
+  and setUseDocumentWrite() methods for InPageAppender and PopUpAppender and\r
+  added console.html to the build so that the appender may use either the\r
+  existing document.write method or the external HTML file to build the console.\r
+  This is to allow support for setting document.domain in the main document,\r
+  which is impossible with the document.write method\r
+\r
+- Added milliseconds property to logging events and changed JsonLayout,\r
+  XmlLayout and HttpPostDataLayout to include milliseconds by default\r
+\r
+- Added layout parameter to AjaxAppender and a toString() method on each layout\r
+\r
+- Setting configuration properties in appenders via constructor paramaters has\r
+  been phased out.\r
+\r
+- Added window.unload handler for AjaxAppender to send outstanding messages.\r
+  Doesn't work in Opera\r
+\r
+- Implemented log4j-style hierarchical loggers with additive appenders. For\r
+  example, a logger called "app.stuff" has as its parent the logger called\r
+  "app", all of whose appenders it inherits\r
+\r
+- Changed XmlLayout and JsonLayout to send data as a key/value pair\r
+\r
+- Bugfix for inaccessible error details\r
+\r
+- An appender can no longer be added more than once to the same logger\r
+\r
+- Multiple messages may now be specified in logger methods\r
+\r
+- New conversion character 'a' added to PatternLayout. This is the same as 'm'\r
+  except that if the first message specified is an array then it treats each\r
+  element of the array as though it had been passed in as a message parameter\r
+\r
+- Command line added to console windows with configurable object expansion\r
+  depth. Command line presence and object expansion depth are configurable in\r
+  the appender via setShowCommandLine() and setCommandLineObjectExpansionDepth()\r
+  methods respectively\r
+\r
+- Command line history, navigated by cursor keys and stored in a session cookie\r
+\r
+- Firebug-inspired command line functions added: $, dir, dirxml, cd, clear,\r
+  keys, values, expansionDepth\r
+\r
+- Fixes for several bugs in object expansion\r
+\r
+- Fix for bug in initialization of InPageAppender in IE 5\r
+\r
+- Fix to allow searchable HTML in log entries\r
+\r
+- Fix for bug which automatically displayed search next/previous buttons when\r
+  the search box is clicked regardless of whether there were any matches\r
+\r
+- Searches in PopUpAppender and InPageAppender now preserve formatting\r
+\r
+- More fixes to interaction of search and severity filters in console window\r
+  used by PopUpAppender and InPageAppender\r
+\r
+- Added SwitchableConsoleAppender that allows flipping from an in-page console\r
+  to a pop-up console window and back again while retaining state\r
+\r
+- Custom events added that are raised when PopUpAppender and InPageAppender\r
+  windows load and unload, and on the main log4javascript object when the main\r
+  page loads, when the main page is resized and when log4javascript errors occur\r
+\r
+- InPageAppender may now be initialized before the page loads by providing an\r
+  element id for its container, or omitting the container altogether (in which\r
+  case the appender is added as a fixed div at the bottom of the page)\r
+\r
+- Tweaked PopUpAppender and InPageAppender so that the formatted log message is\r
+  produced when append() is called rather than when the message is actually sent\r
+  to the console window, thus allowing reliable temporary switching of layouts\r
+\r
+- Much improved scrolling to current search match: scrolls only if part of the\r
+  search match is not visible and centres around it rather than putting flush to\r
+  the top left\r
+\r
+- Removed setReadable() method from JsonLayout - now specified only in the\r
+  constructor\r
+\r
+- Fixed problem in IE where copying selections of log entries would produce two\r
+  copies of each log entry\r
+\r
+\r
+1.3.1 (20/11/2006)\r
+\r
+- Fix to interaction of search and severity filters in console window used by\r
+  PopUpAppender and InPageAppender\r
+\r
+\r
+1.3 (19/10/2006)\r
+\r
+- Fully tested and supported in IE 7 Beta 3\r
+\r
+- Added support for FireBug logging levels in BrowserConsoleAppender\r
+\r
+- Added optional limit to the number of log messages stored by PopUpAppender and\r
+  InPageAppender. When this limit is reached, each new message causes the oldest\r
+  message to be discarded.\r
+\r
+- Exceptions passed into logging methods are now displayed in logging output.\r
+\r
+- Added facility to pass objects as well as strings to logging methods.\r
+  Enhanced conversion character 'm' to PatternLayout to expand object properties\r
+  in the formatted output\r
+\r
+- Added stack trace to error reports (alerts and log entries) in Firefox. This\r
+  is turned off by default but can be switched on via the new\r
+  log4javascript.setShowStackTraces function\r
+\r
+- Added log4javascript_stub.js to distribution - this has stub versions of all\r
+  objects and methods in log4javascript.js and can be used as a lightweight\r
+  replacement for log4javascript.js in production systems\r
+\r
+- Added log4javascript_compressed.js to distribution - comments and whitespace\r
+  are removed, resulting in a 30% smaller file\r
+\r
+- Added custom fields to layouts\r
+\r
+- Added setReopenWhenClosed and isReopenWhenClosed methods to PopUpAppender to\r
+  allow log4javascript to open a new pop-up console window automatically at the\r
+  time of the next log entry after the original window was closed\r
+\r
+- Layout.ignoresThrowable implemented to allow Layout/Appender combinations to\r
+  decide whether to display exceptions\r
+\r
+- Added NullLayout that performs no formatting on the logging event\r
+\r
+- Lowered BrowserConsoleAppender's default threshold to DEBUG and set its\r
+  default layout to NullLayout so that unformatted objects can be passed into\r
+  FireBug\r
+\r
+- Renamed InlineAppender to InPageAppender (though InlineAppender still works\r
+  for the sake of backwards compatibility)\r
+\r
+- Cosmetic changes to InPageAppender and PopUpAppender\r
+\r
+- Added equals() method to Level\r
+\r
+- Added removeAppender() and removeAllAppenders() methods to Logger\r
+\r
+- Added extensive test script\r
+\r
+- Fixed bug where Appender.setLayout and Appender.setThreshold threw an\r
+  unhandled error if not supplied with a genuine Layout or Level respectively\r
+\r
+- Fixed bug where InlinePopUpAppender and PopUpAppender continue to poll their\r
+  console windows indefinitely (thus generating warnings) if the console window\r
+  is closed before it has fully loaded\r
+\r
+- Fixed bug in w and W symbols in SimpleDateFormat\r
+\r
+- Fixed bug with quotes inside messages in JsonLayout\r
+\r
+- Fixed bugs in PatternLayout with built-in DATE format and truncation modifiers\r
+\r
+- Changed execution order of callbacks in AjaxAppender so that\r
+  requestSuccessCallback is guaranteed to be called before the next request is\r
+  sent\r
+\r
+- Changed AjaxAppender so that log messages are formatted immediately before\r
+  a request is sent rather than when append() is called, thus guaranteeing that\r
+  changes to the layout take effect immediately\r
+\r
+- PopUpAppender windows now have unique names per hostname to prevent clashes\r
+  from multiple instances of log4javascript running on different servers\r
+\r
+- Fixed error in XmlLayout's format method when passed an object\r
+\r
+- Fixed errors in JsonLayout's handling of strings containing line breaks and/or\r
+  double quotes\r
+\r
+\r
+1.2 (21/6/2006)\r
+\r
+- Tested in and added workaround for a bug in Opera 9 Beta 2 and Opera 9.0\r
+\r
+- Tested in Konqueror 3.4 and 3.5 and added workarounds and fixes for browser\r
+  bugs\r
+\r
+- Added addErrorListener and removeErrorListener methods to log4javascript\r
+  object to allow custom error handling\r
+\r
+- Added close() method to PopUpAppender and InlineAppender\r
+\r
+- Added test directory with an HTML page containing automated tests\r
+\r
+- Added enable/disable logging checkbox to InlinePopUpAppender and PopUpAppender\r
+  so that unnecessary messages (for instance, from a timer) can be ignored\r
+\r
+- An invalid value supplied to a configuration option setter now leaves config\r
+  property unchanged rather than reverting to the default\r
+\r
+- Fixed bug in PopUpAppender in IE on Windows XP Service Pack 2 when accessed\r
+  via the file system. The browser by default disables JavaScript in the pop-up\r
+  window until the user opts to enable it, at which point they would previously\r
+  see an uncaught error in log4javascript. Now, a proper error message is\r
+  displayed and the appender is disabled.\r
+\r
+- Slight alterations to toolbar in InlineAppender and PopUpAppender - text\r
+  capitalization and title attributes added to inputs\r
+\r
+- toString() method added to all appenders\r
+\r
+- Correction to errors in XmlLayout's output\r
+\r
+- Documentation corrections and additions\r
+\r
+\r
+1.1.1 (17/5/2006)\r
+\r
+- Fixed a minor bug with scrolling to the latest message and added "scroll to\r
+  latest" checkbox to console window in InlineAppender and PopUpAppender\r
+\r
+\r
+1.1 (16/5/2006)\r
+\r
+- Added configuration option setters on Appenders and refactored to prevent\r
+  config properties being altered directly. Several configuration options\r
+  may not be altered after the appender has been initialized\r
+\r
+- Added scrollToLatestMessage constructor parameter, isScrollToLatestMessage\r
+  and setScrollToLatestMessage methods to InlineAppender and PopUpAppender\r
+\r
+- Added isVisible method to InlineAppender\r
+\r
+- Changed setShowOneError to setAlertAllErrors in logLog, with obvious change\r
+  in logic\r
+\r
+- Added layout property key configuration options to layout constructors for\r
+  JsonLayout and HttpPostDataLayout\r
+\r
+- Changed the default timestamp property name to "timestamp" instead of\r
+  "timeStamp" in JsonLayout and HttpPostDataLayout\r
+\r
+- Expanded documentation to include a section in the manual about configuring\r
+  appenders\r
+\r
+- Removed browser sniffing code\r
+\r
+\r
+1.0.1 (30/4/2006)\r
+\r
+- Option to have new log messages appear at the top added to InlineAppender and\r
+  PopUpAppender. This option can be specified in the constructor and can also\r
+  be toggled via a checkbox in the console window\r
+\r
+- PopUpAppender changed to not focus the pop-up console window by default, and\r
+  the demo page altered to create its own logger with focussing turned on,\r
+  meaning the behaviour in the demo is essentially unchanged\r
+\r
+\r
+1.0 (26/4/2006)\r
+\r
+- Tweaks to default values in PopUpAppender and InlineAppender\r
+\r
+- Bugfixes and stylistic tweaks resulting from running JSLint on\r
+  log4javascript.js\r
+\r
+\r
+1.0 beta 2\r
+\r
+- Show/hide button removed from InlineAppender, replaced by show() and hide()\r
+  methods on the InlineAppender object\r
+\r
+- batchSeparator, batchHeader and batchFooter added to Layout and applied to\r
+  JsonLayout - a batch of JSON log messages is now created as an array literal\r
+\r
+\r
+1.0 beta\r
+\r
+- TRACE level added, since this was added to log4j in 1.2.12\r
+\r
+- PopUpAppender default settings bugfix\r
+\r
+- getLevel method added to Logger\r
+\r
+- Tweak to vertical alignment of checkboxes and padding of buttons in\r
+  InlineAppender and PopUpAppender\r
+\r
+- Fixed getDefaultLogger and getNullLogger to return loggers other than the\r
+  root logger\r
+\r
+0.96\r
+\r
+- Moved console.html to inline document.writes in log4javascript.js\r
+\r
+- Fixed getDefaultLogger to return the same object on successive calls\r
+\r
+- Fixed scrolling issue in Opera InlineAppender and PopUpAppender\r
+\r
+- Scrollbars are now automatic on InlineAppender and PopUpAppender, i.e. they\r
+  only appear when required\r
+\r
+- Fixed bug where regex searches were not applied to new log entries in\r
+  InlineAppender and PopUpAppender\r
+\r
+- Changed Safari font size in InlineAppender and PopUpAppender\r
+\r
+0.95\r
+\r
+- AjaxAppender enhancements:\r
+       - waitForResponse added\r
+       - timer added\r
+\r
+- layout parameter added to all appender constructors\r
+\r
+0.94\r
+- First publicly available version\r
+- IE 5 support added\r
+- Full support for wrapping in IE added for InlineAppender and PopUpAppender
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/console.html b/planetstack/core/static/log4javascript-1.4.6/console.html
new file mode 100644 (file)
index 0000000..476d272
--- /dev/null
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+<head>\r
+<title>log4javascript</title>\r
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+<meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+<script type="text/javascript">var isIe = false, isIePre7 = false;</script>\r
+<!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->\r
+<!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->\r
+<script type="text/javascript">\r
+//<![CDATA[\r
+var loggingEnabled=true;var logQueuedEventsTimer=null;var logEntries=[];var logEntriesAndSeparators=[];var logItems=[];var renderDelay=100;var unrenderedLogItemsExist=false;var rootGroup,currentGroup=null;var loaded=false;var currentLogItem=null;var logMainContainer;function copyProperties(obj,props){for(var i in props){obj[i]=props[i];}}\r
+function LogItem(){}\r
+LogItem.prototype={mainContainer:null,wrappedContainer:null,unwrappedContainer:null,group:null,appendToLog:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].appendToLog();}\r
+this.group.update();},doRemove:function(doUpdate,removeFromGroup){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].remove();}\r
+this.unwrappedElementContainer=null;this.wrappedElementContainer=null;this.mainElementContainer=null;}\r
+if(this.group&&removeFromGroup){this.group.removeChild(this,doUpdate);}\r
+if(this===currentLogItem){currentLogItem=null;}},remove:function(doUpdate,removeFromGroup){this.doRemove(doUpdate,removeFromGroup);},render:function(){},accept:function(visitor){visitor.visit(this);},getUnwrappedDomContainer:function(){return this.group.unwrappedElementContainer.contentDiv;},getWrappedDomContainer:function(){return this.group.wrappedElementContainer.contentDiv;},getMainDomContainer:function(){return this.group.mainElementContainer.contentDiv;}};LogItem.serializedItemKeys={LOG_ENTRY:0,GROUP_START:1,GROUP_END:2};function LogItemContainerElement(){}\r
+LogItemContainerElement.prototype={appendToLog:function(){var insertBeforeFirst=(newestAtTop&&this.containerDomNode.hasChildNodes());if(insertBeforeFirst){this.containerDomNode.insertBefore(this.mainDiv,this.containerDomNode.firstChild);}else{this.containerDomNode.appendChild(this.mainDiv);}}};function SeparatorElementContainer(containerDomNode){this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="separator";this.mainDiv.innerHTML="&nbsp;";}\r
+SeparatorElementContainer.prototype=new LogItemContainerElement();SeparatorElementContainer.prototype.remove=function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;};function Separator(){this.rendered=false;}\r
+Separator.prototype=new LogItem();copyProperties(Separator.prototype,{render:function(){var containerDomNode=this.group.contentDiv;if(isIe){this.unwrappedElementContainer=new SeparatorElementContainer(this.getUnwrappedDomContainer());this.wrappedElementContainer=new SeparatorElementContainer(this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new SeparatorElementContainer(this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}\r
+this.content=this.formattedMessage;this.rendered=true;}});function GroupElementContainer(group,containerDomNode,isRoot,isWrapped){this.group=group;this.containerDomNode=containerDomNode;this.isRoot=isRoot;this.isWrapped=isWrapped;this.expandable=false;if(this.isRoot){if(isIe){this.contentDiv=logMainContainer.appendChild(document.createElement("div"));this.contentDiv.id=this.isWrapped?"log_wrapped":"log_unwrapped";}else{this.contentDiv=logMainContainer;}}else{var groupElementContainer=this;this.mainDiv=document.createElement("div");this.mainDiv.className="group";this.headingDiv=this.mainDiv.appendChild(document.createElement("div"));this.headingDiv.className="groupheading";this.expander=this.headingDiv.appendChild(document.createElement("span"));this.expander.className="expander unselectable greyedout";this.expander.unselectable=true;var expanderText=this.group.expanded?"-":"+";this.expanderTextNode=this.expander.appendChild(document.createTextNode(expanderText));this.headingDiv.appendChild(document.createTextNode(" "+this.group.name));this.contentDiv=this.mainDiv.appendChild(document.createElement("div"));var contentCssClass=this.group.expanded?"expanded":"collapsed";this.contentDiv.className="groupcontent "+contentCssClass;this.expander.onclick=function(){if(groupElementContainer.group.expandable){groupElementContainer.group.toggleExpanded();}};}}\r
+GroupElementContainer.prototype=new LogItemContainerElement();copyProperties(GroupElementContainer.prototype,{toggleExpanded:function(){if(!this.isRoot){var oldCssClass,newCssClass,expanderText;if(this.group.expanded){newCssClass="expanded";oldCssClass="collapsed";expanderText="-";}else{newCssClass="collapsed";oldCssClass="expanded";expanderText="+";}\r
+replaceClass(this.contentDiv,newCssClass,oldCssClass);this.expanderTextNode.nodeValue=expanderText;}},remove:function(){if(!this.isRoot){this.headingDiv=null;this.expander.onclick=null;this.expander=null;this.expanderTextNode=null;this.contentDiv=null;this.containerDomNode=null;this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;}},reverseChildren:function(){var node=null;var childDomNodes=[];while((node=this.contentDiv.firstChild)){this.contentDiv.removeChild(node);childDomNodes.push(node);}\r
+while((node=childDomNodes.pop())){this.contentDiv.appendChild(node);}},update:function(){if(!this.isRoot){if(this.group.expandable){removeClass(this.expander,"greyedout");}else{addClass(this.expander,"greyedout");}}},clear:function(){if(this.isRoot){this.contentDiv.innerHTML="";}}});function Group(name,isRoot,initiallyExpanded){this.name=name;this.group=null;this.isRoot=isRoot;this.initiallyExpanded=initiallyExpanded;this.elementContainers=[];this.children=[];this.expanded=initiallyExpanded;this.rendered=false;this.expandable=false;}\r
+Group.prototype=new LogItem();copyProperties(Group.prototype,{addChild:function(logItem){this.children.push(logItem);logItem.group=this;},render:function(){if(isIe){var unwrappedDomContainer,wrappedDomContainer;if(this.isRoot){unwrappedDomContainer=logMainContainer;wrappedDomContainer=logMainContainer;}else{unwrappedDomContainer=this.getUnwrappedDomContainer();wrappedDomContainer=this.getWrappedDomContainer();}\r
+this.unwrappedElementContainer=new GroupElementContainer(this,unwrappedDomContainer,this.isRoot,false);this.wrappedElementContainer=new GroupElementContainer(this,wrappedDomContainer,this.isRoot,true);this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{var mainDomContainer=this.isRoot?logMainContainer:this.getMainDomContainer();this.mainElementContainer=new GroupElementContainer(this,mainDomContainer,this.isRoot,false);this.elementContainers=[this.mainElementContainer];}\r
+this.rendered=true;},toggleExpanded:function(){this.expanded=!this.expanded;for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].toggleExpanded();}},expand:function(){if(!this.expanded){this.toggleExpanded();}},accept:function(visitor){visitor.visitGroup(this);},reverseChildren:function(){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].reverseChildren();}}},update:function(){var previouslyExpandable=this.expandable;this.expandable=(this.children.length!==0);if(this.expandable!==previouslyExpandable){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].update();}}},flatten:function(){var visitor=new GroupFlattener();this.accept(visitor);return visitor.logEntriesAndSeparators;},removeChild:function(child,doUpdate){array_remove(this.children,child);child.group=null;if(doUpdate){this.update();}},remove:function(doUpdate,removeFromGroup){for(var i=0,len=this.children.length;i<len;i++){this.children[i].remove(false,false);}\r
+this.children=[];this.update();if(this===currentGroup){currentGroup=this.group;}\r
+this.doRemove(doUpdate,removeFromGroup);},serialize:function(items){items.push([LogItem.serializedItemKeys.GROUP_START,this.name]);for(var i=0,len=this.children.length;i<len;i++){this.children[i].serialize(items);}\r
+if(this!==currentGroup){items.push([LogItem.serializedItemKeys.GROUP_END]);}},clear:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clear();}}});function LogEntryElementContainer(){}\r
+LogEntryElementContainer.prototype=new LogItemContainerElement();copyProperties(LogEntryElementContainer.prototype,{remove:function(){this.doRemove();},doRemove:function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;this.contentElement=null;this.containerDomNode=null;},setContent:function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=content;}},setSearchMatch:function(isMatch){var oldCssClass=isMatch?"searchnonmatch":"searchmatch";var newCssClass=isMatch?"searchmatch":"searchnonmatch";replaceClass(this.mainDiv,newCssClass,oldCssClass);},clearSearch:function(){removeClass(this.mainDiv,"searchmatch");removeClass(this.mainDiv,"searchnonmatch");}});function LogEntryWrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.mainDiv.className="logentry wrapped "+this.logEntry.level;this.contentElement=this.mainDiv;}\r
+LogEntryWrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryWrappedElementContainer.prototype.setContent=function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=wrappedContent;}};function LogEntryUnwrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry unwrapped "+this.logEntry.level;this.pre=this.mainDiv.appendChild(document.createElement("pre"));this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.pre.className="unwrapped";this.contentElement=this.pre;}\r
+LogEntryUnwrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryUnwrappedElementContainer.prototype.remove=function(){this.doRemove();this.pre=null;};function LogEntryMainElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry nonielogentry "+this.logEntry.level;this.contentElement=this.mainDiv.appendChild(document.createElement("span"));this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));}\r
+LogEntryMainElementContainer.prototype=new LogEntryElementContainer();function LogEntry(level,formattedMessage){this.level=level;this.formattedMessage=formattedMessage;this.rendered=false;}\r
+LogEntry.prototype=new LogItem();copyProperties(LogEntry.prototype,{render:function(){var logEntry=this;var containerDomNode=this.group.contentDiv;if(isIe){this.formattedMessage=this.formattedMessage.replace(/\r\n/g,"\r");this.unwrappedElementContainer=new LogEntryUnwrappedElementContainer(this,this.getUnwrappedDomContainer());this.wrappedElementContainer=new LogEntryWrappedElementContainer(this,this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new LogEntryMainElementContainer(this,this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}\r
+this.content=this.formattedMessage;this.rendered=true;},setContent:function(content,wrappedContent){if(content!=this.content){if(isIe&&(content!==this.formattedMessage)){content=content.replace(/\r\n/g,"\r");}\r
+for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setContent(content,wrappedContent);}\r
+this.content=content;}},getSearchMatches:function(){var matches=[];var i,len;if(isIe){var unwrappedEls=getElementsByClass(this.unwrappedElementContainer.mainDiv,"searchterm","span");var wrappedEls=getElementsByClass(this.wrappedElementContainer.mainDiv,"searchterm","span");for(i=0,len=unwrappedEls.length;i<len;i++){matches[i]=new Match(this.level,null,unwrappedEls[i],wrappedEls[i]);}}else{var els=getElementsByClass(this.mainElementContainer.mainDiv,"searchterm","span");for(i=0,len=els.length;i<len;i++){matches[i]=new Match(this.level,els[i]);}}\r
+return matches;},setSearchMatch:function(isMatch){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setSearchMatch(isMatch);}},clearSearch:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clearSearch();}},accept:function(visitor){visitor.visitLogEntry(this);},serialize:function(items){items.push([LogItem.serializedItemKeys.LOG_ENTRY,this.level,this.formattedMessage]);}});function LogItemVisitor(){}\r
+LogItemVisitor.prototype={visit:function(logItem){},visitParent:function(logItem){if(logItem.group){logItem.group.accept(this);}},visitChildren:function(logItem){for(var i=0,len=logItem.children.length;i<len;i++){logItem.children[i].accept(this);}},visitLogEntry:function(logEntry){this.visit(logEntry);},visitSeparator:function(separator){this.visit(separator);},visitGroup:function(group){this.visit(group);}};function GroupFlattener(){this.logEntriesAndSeparators=[];}\r
+GroupFlattener.prototype=new LogItemVisitor();GroupFlattener.prototype.visitGroup=function(group){this.visitChildren(group);};GroupFlattener.prototype.visitLogEntry=function(logEntry){this.logEntriesAndSeparators.push(logEntry);};GroupFlattener.prototype.visitSeparator=function(separator){this.logEntriesAndSeparators.push(separator);};window.onload=function(){if(location.search){var queryBits=unescape(location.search).substr(1).split("&"),nameValueBits;for(var i=0,len=queryBits.length;i<len;i++){nameValueBits=queryBits[i].split("=");if(nameValueBits[0]=="log4javascript_domain"){document.domain=nameValueBits[1];break;}}}\r
+logMainContainer=$("log");if(isIePre7){addClass(logMainContainer,"oldIe");}\r
+rootGroup=new Group("root",true);rootGroup.render();currentGroup=rootGroup;setCommandInputWidth();setLogContainerHeight();toggleLoggingEnabled();toggleSearchEnabled();toggleSearchFilter();toggleSearchHighlight();applyFilters();checkAllLevels();toggleWrap();toggleNewestAtTop();toggleScrollToLatest();renderQueuedLogItems();loaded=true;$("command").value="";$("command").autocomplete="off";$("command").onkeydown=function(evt){evt=getEvent(evt);if(evt.keyCode==10||evt.keyCode==13){evalCommandLine();stopPropagation(evt);}else if(evt.keyCode==27){this.value="";this.focus();}else if(evt.keyCode==38&&commandHistory.length>0){currentCommandIndex=Math.max(0,currentCommandIndex-1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}else if(evt.keyCode==40&&commandHistory.length>0){currentCommandIndex=Math.min(commandHistory.length-1,currentCommandIndex+1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}};$("command").onkeypress=function(evt){evt=getEvent(evt);if(evt.keyCode==38&&commandHistory.length>0&&evt.preventDefault){evt.preventDefault();}};$("command").onkeyup=function(evt){evt=getEvent(evt);if(evt.keyCode==27&&evt.preventDefault){evt.preventDefault();this.focus();}};document.onkeydown=function keyEventHandler(evt){evt=getEvent(evt);switch(evt.keyCode){case 69:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){evalLastCommand();cancelKeyEvent(evt);return false;}\r
+break;case 75:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusSearch();cancelKeyEvent(evt);return false;}\r
+break;case 40:case 76:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusCommandLine();cancelKeyEvent(evt);return false;}\r
+break;}};setTimeout(setLogContainerHeight,20);setShowCommandLine(showCommandLine);doSearch();};window.onunload=function(){if(mainWindowExists()){appender.unload();}\r
+appender=null;};function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}\r
+function setLoggingEnabled(enable){loggingEnabled=enable;}\r
+var appender=null;function setAppender(appenderParam){appender=appenderParam;}\r
+function setShowCloseButton(showCloseButton){$("closeButton").style.display=showCloseButton?"inline":"none";}\r
+function setShowHideButton(showHideButton){$("hideButton").style.display=showHideButton?"inline":"none";}\r
+var newestAtTop=false;function LogItemContentReverser(){}\r
+LogItemContentReverser.prototype=new LogItemVisitor();LogItemContentReverser.prototype.visitGroup=function(group){group.reverseChildren();this.visitChildren(group);};function setNewestAtTop(isNewestAtTop){var oldNewestAtTop=newestAtTop;var i,iLen,j,jLen;newestAtTop=Boolean(isNewestAtTop);if(oldNewestAtTop!=newestAtTop){var visitor=new LogItemContentReverser();rootGroup.accept(visitor);if(currentSearch){var currentMatch=currentSearch.matches[currentMatchIndex];var matchIndex=0;var matches=[];var actOnLogEntry=function(logEntry){var logEntryMatches=logEntry.getSearchMatches();for(j=0,jLen=logEntryMatches.length;j<jLen;j++){matches[matchIndex]=logEntryMatches[j];if(currentMatch&&logEntryMatches[j].equals(currentMatch)){currentMatchIndex=matchIndex;}\r
+matchIndex++;}};if(newestAtTop){for(i=logEntries.length-1;i>=0;i--){actOnLogEntry(logEntries[i]);}}else{for(i=0,iLen=logEntries.length;i<iLen;i++){actOnLogEntry(logEntries[i]);}}\r
+currentSearch.matches=matches;if(currentMatch){currentMatch.setCurrent();}}else if(scrollToLatest){doScrollToLatest();}}\r
+$("newestAtTop").checked=isNewestAtTop;}\r
+function toggleNewestAtTop(){var isNewestAtTop=$("newestAtTop").checked;setNewestAtTop(isNewestAtTop);}\r
+var scrollToLatest=true;function setScrollToLatest(isScrollToLatest){scrollToLatest=isScrollToLatest;if(scrollToLatest){doScrollToLatest();}\r
+$("scrollToLatest").checked=isScrollToLatest;}\r
+function toggleScrollToLatest(){var isScrollToLatest=$("scrollToLatest").checked;setScrollToLatest(isScrollToLatest);}\r
+function doScrollToLatest(){var l=logMainContainer;if(typeof l.scrollTop!="undefined"){if(newestAtTop){l.scrollTop=0;}else{var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}}\r
+var closeIfOpenerCloses=true;function setCloseIfOpenerCloses(isCloseIfOpenerCloses){closeIfOpenerCloses=isCloseIfOpenerCloses;}\r
+var maxMessages=null;function setMaxMessages(max){maxMessages=max;pruneLogEntries();}\r
+var showCommandLine=false;function setShowCommandLine(isShowCommandLine){showCommandLine=isShowCommandLine;if(loaded){$("commandLine").style.display=showCommandLine?"block":"none";setCommandInputWidth();setLogContainerHeight();}}\r
+function focusCommandLine(){if(loaded){$("command").focus();}}\r
+function focusSearch(){if(loaded){$("searchBox").focus();}}\r
+function getLogItems(){var items=[];for(var i=0,len=logItems.length;i<len;i++){logItems[i].serialize(items);}\r
+return items;}\r
+function setLogItems(items){var loggingReallyEnabled=loggingEnabled;loggingEnabled=true;for(var i=0,len=items.length;i<len;i++){switch(items[i][0]){case LogItem.serializedItemKeys.LOG_ENTRY:log(items[i][1],items[i][2]);break;case LogItem.serializedItemKeys.GROUP_START:group(items[i][1]);break;case LogItem.serializedItemKeys.GROUP_END:groupEnd();break;}}\r
+loggingEnabled=loggingReallyEnabled;}\r
+function log(logLevel,formattedMessage){if(loggingEnabled){var logEntry=new LogEntry(logLevel,formattedMessage);logEntries.push(logEntry);logEntriesAndSeparators.push(logEntry);logItems.push(logEntry);currentGroup.addChild(logEntry);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}\r
+logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}\r
+function renderQueuedLogItems(){logQueuedEventsTimer=null;var pruned=pruneLogEntries();var initiallyHasMatches=currentSearch?currentSearch.hasMatches():false;for(var i=0,len=logItems.length;i<len;i++){if(!logItems[i].rendered){logItems[i].render();logItems[i].appendToLog();if(currentSearch&&(logItems[i]instanceof LogEntry)){currentSearch.applyTo(logItems[i]);}}}\r
+if(currentSearch){if(pruned){if(currentSearch.hasVisibleMatches()){if(currentMatchIndex===null){setCurrentMatchIndex(0);}\r
+displayMatches();}else{displayNoMatches();}}else if(!initiallyHasMatches&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}}\r
+if(scrollToLatest){doScrollToLatest();}\r
+unrenderedLogItemsExist=false;}\r
+function pruneLogEntries(){if((maxMessages!==null)&&(logEntriesAndSeparators.length>maxMessages)){var numberToDelete=logEntriesAndSeparators.length-maxMessages;var prunedLogEntries=logEntriesAndSeparators.slice(0,numberToDelete);if(currentSearch){currentSearch.removeMatches(prunedLogEntries);}\r
+var group;for(var i=0;i<numberToDelete;i++){group=logEntriesAndSeparators[i].group;array_remove(logItems,logEntriesAndSeparators[i]);array_remove(logEntries,logEntriesAndSeparators[i]);logEntriesAndSeparators[i].remove(true,true);if(group.children.length===0&&group!==currentGroup&&group!==rootGroup){array_remove(logItems,group);group.remove(true,true);}}\r
+logEntriesAndSeparators=array_removeFromStart(logEntriesAndSeparators,numberToDelete);return true;}\r
+return false;}\r
+function group(name,startExpanded){if(loggingEnabled){initiallyExpanded=(typeof startExpanded==="undefined")?true:Boolean(startExpanded);var newGroup=new Group(name,false,initiallyExpanded);currentGroup.addChild(newGroup);currentGroup=newGroup;logItems.push(newGroup);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}\r
+logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}\r
+function groupEnd(){currentGroup=(currentGroup===rootGroup)?rootGroup:currentGroup.group;}\r
+function mainPageReloaded(){currentGroup=rootGroup;var separator=new Separator();logEntriesAndSeparators.push(separator);logItems.push(separator);currentGroup.addChild(separator);}\r
+function closeWindow(){if(appender&&mainWindowExists()){appender.close(true);}else{window.close();}}\r
+function hide(){if(appender&&mainWindowExists()){appender.hide();}}\r
+var mainWindow=window;var windowId="log4javascriptConsoleWindow_"+new Date().getTime()+"_"+(""+Math.random()).substr(2);function setMainWindow(win){mainWindow=win;mainWindow[windowId]=window;if(opener&&closeIfOpenerCloses){pollOpener();}}\r
+function pollOpener(){if(closeIfOpenerCloses){if(mainWindowExists()){setTimeout(pollOpener,500);}else{closeWindow();}}}\r
+function mainWindowExists(){try{return(mainWindow&&!mainWindow.closed&&mainWindow[windowId]==window);}catch(ex){}\r
+return false;}\r
+var logLevels=["TRACE","DEBUG","INFO","WARN","ERROR","FATAL"];function getCheckBox(logLevel){return $("switch_"+logLevel);}\r
+function getIeWrappedLogContainer(){return $("log_wrapped");}\r
+function getIeUnwrappedLogContainer(){return $("log_unwrapped");}\r
+function applyFilters(){for(var i=0;i<logLevels.length;i++){if(getCheckBox(logLevels[i]).checked){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}\r
+updateSearchFromFilters();}\r
+function toggleAllLevels(){var turnOn=$("switch_ALL").checked;for(var i=0;i<logLevels.length;i++){getCheckBox(logLevels[i]).checked=turnOn;if(turnOn){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}}\r
+function checkAllLevels(){for(var i=0;i<logLevels.length;i++){if(!getCheckBox(logLevels[i]).checked){getCheckBox("ALL").checked=false;return;}}\r
+getCheckBox("ALL").checked=true;}\r
+function clearLog(){rootGroup.clear();currentGroup=rootGroup;logEntries=[];logItems=[];logEntriesAndSeparators=[];doSearch();}\r
+function toggleWrap(){var enable=$("wrap").checked;if(enable){addClass(logMainContainer,"wrap");}else{removeClass(logMainContainer,"wrap");}\r
+refreshCurrentMatch();}\r
+var searchTimer=null;function scheduleSearch(){try{clearTimeout(searchTimer);}catch(ex){}\r
+searchTimer=setTimeout(doSearch,500);}\r
+function Search(searchTerm,isRegex,searchRegex,isCaseSensitive){this.searchTerm=searchTerm;this.isRegex=isRegex;this.searchRegex=searchRegex;this.isCaseSensitive=isCaseSensitive;this.matches=[];}\r
+Search.prototype={hasMatches:function(){return this.matches.length>0;},hasVisibleMatches:function(){if(this.hasMatches()){for(var i=0;i<this.matches.length;i++){if(this.matches[i].isVisible()){return true;}}}\r
+return false;},match:function(logEntry){var entryText=String(logEntry.formattedMessage);var matchesSearch=false;if(this.isRegex){matchesSearch=this.searchRegex.test(entryText);}else if(this.isCaseSensitive){matchesSearch=(entryText.indexOf(this.searchTerm)>-1);}else{matchesSearch=(entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase())>-1);}\r
+return matchesSearch;},getNextVisibleMatchIndex:function(){for(var i=currentMatchIndex+1;i<this.matches.length;i++){if(this.matches[i].isVisible()){return i;}}\r
+for(i=0;i<=currentMatchIndex;i++){if(this.matches[i].isVisible()){return i;}}\r
+return-1;},getPreviousVisibleMatchIndex:function(){for(var i=currentMatchIndex-1;i>=0;i--){if(this.matches[i].isVisible()){return i;}}\r
+for(var i=this.matches.length-1;i>=currentMatchIndex;i--){if(this.matches[i].isVisible()){return i;}}\r
+return-1;},applyTo:function(logEntry){var doesMatch=this.match(logEntry);if(doesMatch){logEntry.group.expand();logEntry.setSearchMatch(true);var logEntryContent;var wrappedLogEntryContent;var searchTermReplacementStartTag="<span class=\"searchterm\">";var searchTermReplacementEndTag="<"+"/span>";var preTagName=isIe?"pre":"span";var preStartTag="<"+preTagName+" class=\"pre\">";var preEndTag="<"+"/"+preTagName+">";var startIndex=0;var searchIndex,matchedText,textBeforeMatch;if(this.isRegex){var flags=this.isCaseSensitive?"g":"gi";var capturingRegex=new RegExp("("+this.searchRegex.source+")",flags);var rnd=(""+Math.random()).substr(2);var startToken="%%s"+rnd+"%%";var endToken="%%e"+rnd+"%%";logEntryContent=logEntry.formattedMessage.replace(capturingRegex,startToken+"$1"+endToken);logEntryContent=escapeHtml(logEntryContent);var result;var searchString=logEntryContent;logEntryContent="";wrappedLogEntryContent="";while((searchIndex=searchString.indexOf(startToken,startIndex))>-1){var endTokenIndex=searchString.indexOf(endToken,searchIndex);matchedText=searchString.substring(searchIndex+startToken.length,endTokenIndex);textBeforeMatch=searchString.substring(startIndex,searchIndex);logEntryContent+=preStartTag+textBeforeMatch+preEndTag;logEntryContent+=searchTermReplacementStartTag+preStartTag+matchedText+\r
+preEndTag+searchTermReplacementEndTag;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+\r
+matchedText+searchTermReplacementEndTag;}\r
+startIndex=endTokenIndex+endToken.length;}\r
+logEntryContent+=preStartTag+searchString.substr(startIndex)+preEndTag;if(isIe){wrappedLogEntryContent+=searchString.substr(startIndex);}}else{logEntryContent="";wrappedLogEntryContent="";var searchTermReplacementLength=searchTermReplacementStartTag.length+\r
+this.searchTerm.length+searchTermReplacementEndTag.length;var searchTermLength=this.searchTerm.length;var searchTermLowerCase=this.searchTerm.toLowerCase();var logTextLowerCase=logEntry.formattedMessage.toLowerCase();while((searchIndex=logTextLowerCase.indexOf(searchTermLowerCase,startIndex))>-1){matchedText=escapeHtml(logEntry.formattedMessage.substr(searchIndex,this.searchTerm.length));textBeforeMatch=escapeHtml(logEntry.formattedMessage.substring(startIndex,searchIndex));var searchTermReplacement=searchTermReplacementStartTag+\r
+preStartTag+matchedText+preEndTag+searchTermReplacementEndTag;logEntryContent+=preStartTag+textBeforeMatch+preEndTag+searchTermReplacement;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+\r
+matchedText+searchTermReplacementEndTag;}\r
+startIndex=searchIndex+searchTermLength;}\r
+var textAfterLastMatch=escapeHtml(logEntry.formattedMessage.substr(startIndex));logEntryContent+=preStartTag+textAfterLastMatch+preEndTag;if(isIe){wrappedLogEntryContent+=textAfterLastMatch;}}\r
+logEntry.setContent(logEntryContent,wrappedLogEntryContent);var logEntryMatches=logEntry.getSearchMatches();this.matches=this.matches.concat(logEntryMatches);}else{logEntry.setSearchMatch(false);logEntry.setContent(logEntry.formattedMessage,logEntry.formattedMessage);}\r
+return doesMatch;},removeMatches:function(logEntries){var matchesToRemoveCount=0;var currentMatchRemoved=false;var matchesToRemove=[];var i,iLen,j,jLen;for(i=0,iLen=this.matches.length;i<iLen;i++){for(j=0,jLen=logEntries.length;j<jLen;j++){if(this.matches[i].belongsTo(logEntries[j])){matchesToRemove.push(this.matches[i]);if(i===currentMatchIndex){currentMatchRemoved=true;}}}}\r
+var newMatch=currentMatchRemoved?null:this.matches[currentMatchIndex];if(currentMatchRemoved){for(i=currentMatchIndex,iLen=this.matches.length;i<iLen;i++){if(this.matches[i].isVisible()&&!array_contains(matchesToRemove,this.matches[i])){newMatch=this.matches[i];break;}}}\r
+for(i=0,iLen=matchesToRemove.length;i<iLen;i++){array_remove(this.matches,matchesToRemove[i]);matchesToRemove[i].remove();}\r
+if(this.hasVisibleMatches()){if(newMatch===null){setCurrentMatchIndex(0);}else{var newMatchIndex=0;for(i=0,iLen=this.matches.length;i<iLen;i++){if(newMatch===this.matches[i]){newMatchIndex=i;break;}}\r
+setCurrentMatchIndex(newMatchIndex);}}else{currentMatchIndex=null;displayNoMatches();}}};function getPageOffsetTop(el,container){var currentEl=el;var y=0;while(currentEl&&currentEl!=container){y+=currentEl.offsetTop;currentEl=currentEl.offsetParent;}\r
+return y;}\r
+function scrollIntoView(el){var logContainer=logMainContainer;if(!$("wrap").checked){var logContainerLeft=logContainer.scrollLeft;var logContainerRight=logContainerLeft+logContainer.offsetWidth;var elLeft=el.offsetLeft;var elRight=elLeft+el.offsetWidth;if(elLeft<logContainerLeft||elRight>logContainerRight){logContainer.scrollLeft=elLeft-(logContainer.offsetWidth-el.offsetWidth)/2;}}\r
+var logContainerTop=logContainer.scrollTop;var logContainerBottom=logContainerTop+logContainer.offsetHeight;var elTop=getPageOffsetTop(el)-getToolBarsHeight();var elBottom=elTop+el.offsetHeight;if(elTop<logContainerTop||elBottom>logContainerBottom){logContainer.scrollTop=elTop-(logContainer.offsetHeight-el.offsetHeight)/2;}}\r
+function Match(logEntryLevel,spanInMainDiv,spanInUnwrappedPre,spanInWrappedDiv){this.logEntryLevel=logEntryLevel;this.spanInMainDiv=spanInMainDiv;if(isIe){this.spanInUnwrappedPre=spanInUnwrappedPre;this.spanInWrappedDiv=spanInWrappedDiv;}\r
+this.mainSpan=isIe?spanInUnwrappedPre:spanInMainDiv;}\r
+Match.prototype={equals:function(match){return this.mainSpan===match.mainSpan;},setCurrent:function(){if(isIe){addClass(this.spanInUnwrappedPre,"currentmatch");addClass(this.spanInWrappedDiv,"currentmatch");var elementToScroll=$("wrap").checked?this.spanInWrappedDiv:this.spanInUnwrappedPre;scrollIntoView(elementToScroll);}else{addClass(this.spanInMainDiv,"currentmatch");scrollIntoView(this.spanInMainDiv);}},belongsTo:function(logEntry){if(isIe){return isDescendant(this.spanInUnwrappedPre,logEntry.unwrappedPre);}else{return isDescendant(this.spanInMainDiv,logEntry.mainDiv);}},setNotCurrent:function(){if(isIe){removeClass(this.spanInUnwrappedPre,"currentmatch");removeClass(this.spanInWrappedDiv,"currentmatch");}else{removeClass(this.spanInMainDiv,"currentmatch");}},isOrphan:function(){return isOrphan(this.mainSpan);},isVisible:function(){return getCheckBox(this.logEntryLevel).checked;},remove:function(){if(isIe){this.spanInUnwrappedPre=null;this.spanInWrappedDiv=null;}else{this.spanInMainDiv=null;}}};var currentSearch=null;var currentMatchIndex=null;function doSearch(){var searchBox=$("searchBox");var searchTerm=searchBox.value;var isRegex=$("searchRegex").checked;var isCaseSensitive=$("searchCaseSensitive").checked;var i;if(searchTerm===""){$("searchReset").disabled=true;$("searchNav").style.display="none";removeClass(document.body,"searching");removeClass(searchBox,"hasmatches");removeClass(searchBox,"nomatches");for(i=0;i<logEntries.length;i++){logEntries[i].clearSearch();logEntries[i].setContent(logEntries[i].formattedMessage,logEntries[i].formattedMessage);}\r
+currentSearch=null;setLogContainerHeight();}else{$("searchReset").disabled=false;$("searchNav").style.display="block";var searchRegex;var regexValid;if(isRegex){try{searchRegex=isCaseSensitive?new RegExp(searchTerm,"g"):new RegExp(searchTerm,"gi");regexValid=true;replaceClass(searchBox,"validregex","invalidregex");searchBox.title="Valid regex";}catch(ex){regexValid=false;replaceClass(searchBox,"invalidregex","validregex");searchBox.title="Invalid regex: "+(ex.message?ex.message:(ex.description?ex.description:"unknown error"));return;}}else{searchBox.title="";removeClass(searchBox,"validregex");removeClass(searchBox,"invalidregex");}\r
+addClass(document.body,"searching");currentSearch=new Search(searchTerm,isRegex,searchRegex,isCaseSensitive);for(i=0;i<logEntries.length;i++){currentSearch.applyTo(logEntries[i]);}\r
+setLogContainerHeight();if(currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}else{displayNoMatches();}}}\r
+function updateSearchFromFilters(){if(currentSearch){if(currentSearch.hasMatches()){if(currentMatchIndex===null){currentMatchIndex=0;}\r
+var currentMatch=currentSearch.matches[currentMatchIndex];if(currentMatch.isVisible()){displayMatches();setCurrentMatchIndex(currentMatchIndex);}else{currentMatch.setNotCurrent();var nextVisibleMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextVisibleMatchIndex>-1){setCurrentMatchIndex(nextVisibleMatchIndex);displayMatches();}else{displayNoMatches();}}}else{displayNoMatches();}}}\r
+function refreshCurrentMatch(){if(currentSearch&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(currentMatchIndex);}}\r
+function displayMatches(){replaceClass($("searchBox"),"hasmatches","nomatches");$("searchBox").title=""+currentSearch.matches.length+" matches found";$("searchNav").style.display="block";setLogContainerHeight();}\r
+function displayNoMatches(){replaceClass($("searchBox"),"nomatches","hasmatches");$("searchBox").title="No matches found";$("searchNav").style.display="none";setLogContainerHeight();}\r
+function toggleSearchEnabled(enable){enable=(typeof enable=="undefined")?!$("searchDisable").checked:enable;$("searchBox").disabled=!enable;$("searchReset").disabled=!enable;$("searchRegex").disabled=!enable;$("searchNext").disabled=!enable;$("searchPrevious").disabled=!enable;$("searchCaseSensitive").disabled=!enable;$("searchNav").style.display=(enable&&($("searchBox").value!=="")&&currentSearch&&currentSearch.hasVisibleMatches())?"block":"none";if(enable){removeClass($("search"),"greyedout");addClass(document.body,"searching");if($("searchHighlight").checked){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}\r
+if($("searchFilter").checked){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}\r
+$("searchDisable").checked=!enable;}else{addClass($("search"),"greyedout");removeClass(document.body,"searching");removeClass(logMainContainer,"searchhighlight");removeClass(logMainContainer,"searchfilter");}\r
+setLogContainerHeight();}\r
+function toggleSearchFilter(){var enable=$("searchFilter").checked;if(enable){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}\r
+refreshCurrentMatch();}\r
+function toggleSearchHighlight(){var enable=$("searchHighlight").checked;if(enable){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}}\r
+function clearSearch(){$("searchBox").value="";doSearch();}\r
+function searchNext(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var nextMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextMatchIndex>currentMatchIndex||confirm("Reached the end of the page. Start from the top?")){setCurrentMatchIndex(nextMatchIndex);}}}\r
+function searchPrevious(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var previousMatchIndex=currentSearch.getPreviousVisibleMatchIndex();if(previousMatchIndex<currentMatchIndex||confirm("Reached the start of the page. Continue from the bottom?")){setCurrentMatchIndex(previousMatchIndex);}}}\r
+function setCurrentMatchIndex(index){currentMatchIndex=index;currentSearch.matches[currentMatchIndex].setCurrent();}\r
+function addClass(el,cssClass){if(!hasClass(el,cssClass)){if(el.className){el.className+=" "+cssClass;}else{el.className=cssClass;}}}\r
+function hasClass(el,cssClass){if(el.className){var classNames=el.className.split(" ");return array_contains(classNames,cssClass);}\r
+return false;}\r
+function removeClass(el,cssClass){if(hasClass(el,cssClass)){var existingClasses=el.className.split(" ");var newClasses=[];for(var i=0,len=existingClasses.length;i<len;i++){if(existingClasses[i]!=cssClass){newClasses[newClasses.length]=existingClasses[i];}}\r
+el.className=newClasses.join(" ");}}\r
+function replaceClass(el,newCssClass,oldCssClass){removeClass(el,oldCssClass);addClass(el,newCssClass);}\r
+function getElementsByClass(el,cssClass,tagName){var elements=el.getElementsByTagName(tagName);var matches=[];for(var i=0,len=elements.length;i<len;i++){if(hasClass(elements[i],cssClass)){matches.push(elements[i]);}}\r
+return matches;}\r
+function $(id){return document.getElementById(id);}\r
+function isDescendant(node,ancestorNode){while(node!=null){if(node===ancestorNode){return true;}\r
+node=node.parentNode;}\r
+return false;}\r
+function isOrphan(node){var currentNode=node;while(currentNode){if(currentNode==document.body){return false;}\r
+currentNode=currentNode.parentNode;}\r
+return true;}\r
+function escapeHtml(str){return str.replace(/&/g,"&amp;").replace(/[<]/g,"&lt;").replace(/>/g,"&gt;");}\r
+function getWindowWidth(){if(window.innerWidth){return window.innerWidth;}else if(document.documentElement&&document.documentElement.clientWidth){return document.documentElement.clientWidth;}else if(document.body){return document.body.clientWidth;}\r
+return 0;}\r
+function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}\r
+return 0;}\r
+function getToolBarsHeight(){return $("switches").offsetHeight;}\r
+function getChromeHeight(){var height=getToolBarsHeight();if(showCommandLine){height+=$("commandLine").offsetHeight;}\r
+return height;}\r
+function setLogContainerHeight(){if(logMainContainer){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";logMainContainer.style.height=""+\r
+Math.max(0,windowHeight-getChromeHeight())+"px";}}\r
+function setCommandInputWidth(){if(showCommandLine){$("command").style.width=""+Math.max(0,$("commandLineContainer").offsetWidth-\r
+($("evaluateButton").offsetWidth+13))+"px";}}\r
+window.onresize=function(){setCommandInputWidth();setLogContainerHeight();};if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}\r
+return this.length;};}\r
+if(!Array.prototype.pop){Array.prototype.pop=function(){if(this.length>0){var val=this[this.length-1];this.length=this.length-1;return val;}};}\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length=this.length-1;return firstItem;}};}\r
+if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}\r
+var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}\r
+return itemsDeleted;};}\r
+function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}\r
+if(index>=0){arr.splice(index,1);return index;}else{return false;}}\r
+function array_removeFromStart(array,numberToRemove){if(Array.prototype.splice){array.splice(0,numberToRemove);}else{for(var i=numberToRemove,len=array.length;i<len;i++){array[i-numberToRemove]=array[i];}\r
+array.length=array.length-numberToRemove;}\r
+return array;}\r
+function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function getErrorMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}\r
+return""+ex;}\r
+function moveCaretToEnd(input){if(input.setSelectionRange){input.focus();var length=input.value.length;input.setSelectionRange(length,length);}else if(input.createTextRange){var range=input.createTextRange();range.collapse(false);range.select();}\r
+input.focus();}\r
+function stopPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}}\r
+function getEvent(evt){return evt?evt:event;}\r
+function getTarget(evt){return evt.target?evt.target:evt.srcElement;}\r
+function getRelatedTarget(evt){if(evt.relatedTarget){return evt.relatedTarget;}else if(evt.srcElement){switch(evt.type){case"mouseover":return evt.fromElement;case"mouseout":return evt.toElement;default:return evt.srcElement;}}}\r
+function cancelKeyEvent(evt){evt.returnValue=false;stopPropagation(evt);}\r
+function evalCommandLine(){var expr=$("command").value;evalCommand(expr);$("command").value="";}\r
+function evalLastCommand(){if(lastCommand!=null){evalCommand(lastCommand);}}\r
+var lastCommand=null;var commandHistory=[];var currentCommandIndex=0;function evalCommand(expr){if(appender){appender.evalCommandAndAppend(expr);}else{var prefix=">>> "+expr+"\r\n";try{log("INFO",prefix+eval(expr));}catch(ex){log("ERROR",prefix+"Error: "+getErrorMessage(ex));}}\r
+if(expr!=commandHistory[commandHistory.length-1]){commandHistory.push(expr);if(appender){appender.storeCommandHistory(commandHistory);}}\r
+currentCommandIndex=(expr==commandHistory[currentCommandIndex])?currentCommandIndex+1:commandHistory.length;lastCommand=expr;}\r
+//]]>\r
+</script>\r
+<style type="text/css">\r
+body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#switchesContainer input{margin-bottom:0}div.toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div.toolbar,div#search input{font-family:tahoma,verdana,arial,helvetica,sans-serif}div.toolbar input.button{padding:0 5px;font-size:100%}div.toolbar input.hidden{display:none}div#switches input#clearButton{margin-left:20px}div#levels label{font-weight:bold}div#levels label,div#options label{margin-right:5px}div#levels label#wrapLabel{font-weight:normal}div#search label{margin-right:10px}div#search label.searchboxlabel{margin-right:0}div#search input{font-size:100%}div#search input.validregex{color:green}div#search input.invalidregex{color:red}div#search input.nomatches{color:white;background-color:#ff6666}div#search input.nomatches{color:white;background-color:#ff6666}div#searchNav{display:none}div#commandLine{display:none}div#commandLine input#command{font-size:100%;font-family:Courier New,Courier}div#commandLine input#evaluateButton{}*.greyedout{color:gray !important;border-color:gray !important}*.greyedout *.alwaysenabled{color:black}*.unselectable{-khtml-user-select:none;-moz-user-select:none;user-select:none}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both;position:relative}div.group{border-color:#cccccc;border-style:solid;border-width:1px 0 1px 1px;overflow:visible}div.oldIe div.group,div.oldIe div.group *,div.oldIe *.logentry{height:1%}div.group div.groupheading span.expander{border:solid black 1px;font-family:Courier New,Courier;font-size:0.833em;background-color:#eeeeee;position:relative;top:-1px;color:black;padding:0 2px;cursor:pointer;cursor:hand;height:1%}div.group div.groupcontent{margin-left:10px;padding-bottom:2px;overflow:visible}div.group div.expanded{display:block}div.group div.collapsed{display:none}*.logentry{overflow:visible;display:none;white-space:pre}span.pre{white-space:pre}pre.unwrapped{display:inline !important}pre.unwrapped pre.pre,div.wrapped pre.pre{display:inline}div.wrapped pre.pre{white-space:normal}div.wrapped{display:none}body.searching *.logentry span.currentmatch{color:white !important;background-color:green !important}body.searching div.searchhighlight *.logentry span.searchterm{color:black;background-color:yellow}div.wrap *.logentry{white-space:normal !important;border-width:0 0 1px 0;border-color:#dddddd;border-style:dotted}div.wrap #log_wrapped,#log_unwrapped{display:block}div.wrap #log_unwrapped,#log_wrapped{display:none}div.wrap *.logentry span.pre{overflow:visible;white-space:normal}div.wrap *.logentry pre.unwrapped{display:none}div.wrap *.logentry span.wrapped{display:inline}div.searchfilter *.searchnonmatch{display:none !important}div#log *.TRACE,label#label_TRACE{color:#666666}div#log *.DEBUG,label#label_DEBUG{color:green}div#log *.INFO,label#label_INFO{color:#000099}div#log *.WARN,label#label_WARN{color:#999900}div#log *.ERROR,label#label_ERROR{color:red}div#log *.FATAL,label#label_FATAL{color:#660066}div.TRACE#log *.TRACE,div.DEBUG#log *.DEBUG,div.INFO#log *.INFO,div.WARN#log *.WARN,div.ERROR#log *.ERROR,div.FATAL#log *.FATAL{display:block}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}\r
+</style>\r
+</head>\r
+<body id="body">\r
+<div id="switchesContainer">\r
+<div id="switches">\r
+<div id="levels" class="toolbar">\r
+Filters:\r
+<input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>\r
+<input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>\r
+<input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>\r
+<input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>\r
+<input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>\r
+<input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>\r
+<input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>\r
+</div>\r
+<div id="search" class="toolbar">\r
+<label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />\r
+<input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />\r
+<input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>\r
+<input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>\r
+<input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>\r
+<div id="searchNav">\r
+<input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />\r
+<input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />\r
+<input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>\r
+<input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>\r
+</div>\r
+</div>\r
+<div id="options" class="toolbar">\r
+Options:\r
+<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>\r
+<input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>\r
+<input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>\r
+<input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>\r
+<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />\r
+<input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />\r
+<input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />\r
+</div>\r
+</div>\r
+</div>\r
+<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+<div id="commandLine" class="toolbar">\r
+<div id="commandLineContainer">\r
+<input type="text" id="command" title="Enter a JavaScript command here and hit return or press 'Evaluate'" />\r
+<input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />\r
+</div>\r
+</div>\r
+</body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/console_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/console_uncompressed.html
new file mode 100644 (file)
index 0000000..55679f8
--- /dev/null
@@ -0,0 +1,2279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript</title>\r
+               <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+               <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+               <meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+               <script type="text/javascript">var isIe = false, isIePre7 = false;</script>\r
+               <!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->\r
+               <!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->\r
+               <script type="text/javascript">\r
+                       //<![CDATA[\r
+                       var loggingEnabled = true;\r
+                       var logQueuedEventsTimer = null;\r
+                       var logEntries = [];\r
+                       var logEntriesAndSeparators = [];\r
+                       var logItems = [];\r
+                       var renderDelay = 100;\r
+                       var unrenderedLogItemsExist = false;\r
+                       var rootGroup, currentGroup = null;\r
+                       var loaded = false;\r
+                       var currentLogItem = null;\r
+                       var logMainContainer;\r
+\r
+                       function copyProperties(obj, props) {\r
+                               for (var i in props) {\r
+                                       obj[i] = props[i];\r
+                               }\r
+                       }\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItem() {\r
+                       }\r
+\r
+                       LogItem.prototype = {\r
+                               mainContainer: null,\r
+                               wrappedContainer: null,\r
+                               unwrappedContainer: null,\r
+                               group: null,\r
+\r
+                               appendToLog: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].appendToLog();\r
+                                       }\r
+                                       this.group.update();\r
+                               },\r
+\r
+                               doRemove: function(doUpdate, removeFromGroup) {\r
+                                       if (this.rendered) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].remove();\r
+                                               }\r
+                                               this.unwrappedElementContainer = null;\r
+                                               this.wrappedElementContainer = null;\r
+                                               this.mainElementContainer = null;\r
+                                       }\r
+                                       if (this.group && removeFromGroup) {\r
+                                               this.group.removeChild(this, doUpdate);\r
+                                       }\r
+                                       if (this === currentLogItem) {\r
+                                               currentLogItem = null;\r
+                                       }\r
+                               },\r
+\r
+                               remove: function(doUpdate, removeFromGroup) {\r
+                                       this.doRemove(doUpdate, removeFromGroup);\r
+                               },\r
+\r
+                               render: function() {},\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visit(this);\r
+                               },\r
+\r
+                               getUnwrappedDomContainer: function() {\r
+                                       return this.group.unwrappedElementContainer.contentDiv;\r
+                               },\r
+\r
+                               getWrappedDomContainer: function() {\r
+                                       return this.group.wrappedElementContainer.contentDiv;\r
+                               },\r
+\r
+                               getMainDomContainer: function() {\r
+                                       return this.group.mainElementContainer.contentDiv;\r
+                               }\r
+                       };\r
+\r
+                       LogItem.serializedItemKeys = {LOG_ENTRY: 0, GROUP_START: 1, GROUP_END: 2};\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemContainerElement() {\r
+                       }\r
+\r
+                       LogItemContainerElement.prototype = {\r
+                               appendToLog: function() {\r
+                                       var insertBeforeFirst = (newestAtTop && this.containerDomNode.hasChildNodes());\r
+                                       if (insertBeforeFirst) {\r
+                                               this.containerDomNode.insertBefore(this.mainDiv, this.containerDomNode.firstChild);\r
+                                       } else {\r
+                                               this.containerDomNode.appendChild(this.mainDiv);\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function SeparatorElementContainer(containerDomNode) {\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "separator";\r
+                               this.mainDiv.innerHTML = "&nbsp;";\r
+                       }\r
+\r
+                       SeparatorElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       SeparatorElementContainer.prototype.remove = function() {\r
+                               this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                               this.mainDiv = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function Separator() {\r
+                               this.rendered = false;\r
+                       }\r
+\r
+                       Separator.prototype = new LogItem();\r
+\r
+                       copyProperties(Separator.prototype, {\r
+                               render: function() {\r
+                                       var containerDomNode = this.group.contentDiv;\r
+                                       if (isIe) {\r
+                                               this.unwrappedElementContainer = new SeparatorElementContainer(this.getUnwrappedDomContainer());\r
+                                               this.wrappedElementContainer = new SeparatorElementContainer(this.getWrappedDomContainer());\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               this.mainElementContainer = new SeparatorElementContainer(this.getMainDomContainer());\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.content = this.formattedMessage;\r
+                                       this.rendered = true;\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function GroupElementContainer(group, containerDomNode, isRoot, isWrapped) {\r
+                               this.group = group;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.isRoot = isRoot;\r
+                               this.isWrapped = isWrapped;\r
+                               this.expandable = false;\r
+\r
+                               if (this.isRoot) {\r
+                                       if (isIe) {\r
+                                               this.contentDiv = logMainContainer.appendChild(document.createElement("div"));\r
+                                               this.contentDiv.id = this.isWrapped ? "log_wrapped" : "log_unwrapped";\r
+                                       } else {\r
+                                               this.contentDiv = logMainContainer;\r
+                                       }\r
+                               } else {\r
+                                       var groupElementContainer = this;\r
+                                       \r
+                                       this.mainDiv = document.createElement("div");\r
+                                       this.mainDiv.className = "group";\r
+\r
+                                       this.headingDiv = this.mainDiv.appendChild(document.createElement("div"));\r
+                                       this.headingDiv.className = "groupheading";\r
+\r
+                                       this.expander = this.headingDiv.appendChild(document.createElement("span"));\r
+                                       this.expander.className = "expander unselectable greyedout";\r
+                                       this.expander.unselectable = true;\r
+                                       var expanderText = this.group.expanded ? "-" : "+";\r
+                                       this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));\r
+                                       \r
+                                       this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));\r
+\r
+                                       this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));\r
+                                       var contentCssClass = this.group.expanded ? "expanded" : "collapsed";\r
+                                       this.contentDiv.className = "groupcontent " + contentCssClass;\r
+\r
+                                       this.expander.onclick = function() {\r
+                                               if (groupElementContainer.group.expandable) {\r
+                                                       groupElementContainer.group.toggleExpanded();\r
+                                               }\r
+                                       };\r
+                               }\r
+                       }\r
+\r
+                       GroupElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       copyProperties(GroupElementContainer.prototype, {\r
+                               toggleExpanded: function() {\r
+                                       if (!this.isRoot) {\r
+                                               var oldCssClass, newCssClass, expanderText;\r
+                                               if (this.group.expanded) {\r
+                                                       newCssClass = "expanded";\r
+                                                       oldCssClass = "collapsed";\r
+                                                       expanderText = "-";\r
+                                               } else {\r
+                                                       newCssClass = "collapsed";\r
+                                                       oldCssClass = "expanded";\r
+                                                       expanderText = "+";\r
+                                               }\r
+                                               replaceClass(this.contentDiv, newCssClass, oldCssClass);\r
+                                               this.expanderTextNode.nodeValue = expanderText;\r
+                                       }\r
+                               },\r
+\r
+                               remove: function() {\r
+                                       if (!this.isRoot) {\r
+                                               this.headingDiv = null;\r
+                                               this.expander.onclick = null;\r
+                                               this.expander = null;\r
+                                               this.expanderTextNode = null;\r
+                                               this.contentDiv = null;\r
+                                               this.containerDomNode = null;\r
+                                               this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                                               this.mainDiv = null;\r
+                                       }\r
+                               },\r
+\r
+                               reverseChildren: function() {\r
+                                       // Invert the order of the log entries\r
+                                       var node = null;\r
+\r
+                                       // Remove all the log container nodes\r
+                                       var childDomNodes = [];\r
+                                       while ((node = this.contentDiv.firstChild)) {\r
+                                               this.contentDiv.removeChild(node);\r
+                                               childDomNodes.push(node);\r
+                                       }\r
+\r
+                                       // Put them all back in reverse order\r
+                                       while ((node = childDomNodes.pop())) {\r
+                                               this.contentDiv.appendChild(node);\r
+                                       }\r
+                               },\r
+\r
+                               update: function() {\r
+                                       if (!this.isRoot) {\r
+                                               if (this.group.expandable) {\r
+                                                       removeClass(this.expander, "greyedout");\r
+                                               } else {\r
+                                                       addClass(this.expander, "greyedout");\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               clear: function() {\r
+                                       if (this.isRoot) {\r
+                                               this.contentDiv.innerHTML = "";\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function Group(name, isRoot, initiallyExpanded) {\r
+                               this.name = name;\r
+                               this.group = null;\r
+                               this.isRoot = isRoot;\r
+                               this.initiallyExpanded = initiallyExpanded;\r
+                               this.elementContainers = [];\r
+                               this.children = [];\r
+                               this.expanded = initiallyExpanded;\r
+                               this.rendered = false;\r
+                               this.expandable = false;\r
+                       }\r
+\r
+                       Group.prototype = new LogItem();\r
+\r
+                       copyProperties(Group.prototype, {\r
+                               addChild: function(logItem) {\r
+                                       this.children.push(logItem);\r
+                                       logItem.group = this;\r
+                               },\r
+\r
+                               render: function() {\r
+                                       if (isIe) {\r
+                                               var unwrappedDomContainer, wrappedDomContainer;\r
+                                               if (this.isRoot) {\r
+                                                       unwrappedDomContainer = logMainContainer;\r
+                                                       wrappedDomContainer = logMainContainer;\r
+                                               } else {\r
+                                                       unwrappedDomContainer = this.getUnwrappedDomContainer();\r
+                                                       wrappedDomContainer = this.getWrappedDomContainer();\r
+                                               }\r
+                                               this.unwrappedElementContainer = new GroupElementContainer(this, unwrappedDomContainer, this.isRoot, false);\r
+                                               this.wrappedElementContainer = new GroupElementContainer(this, wrappedDomContainer, this.isRoot, true);\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               var mainDomContainer = this.isRoot ? logMainContainer : this.getMainDomContainer();\r
+                                               this.mainElementContainer = new GroupElementContainer(this, mainDomContainer, this.isRoot, false);\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.rendered = true;\r
+                               },\r
+\r
+                               toggleExpanded: function() {\r
+                                       this.expanded = !this.expanded;\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].toggleExpanded();\r
+                                       }\r
+                               },\r
+\r
+                               expand: function() {\r
+                                       if (!this.expanded) {\r
+                                               this.toggleExpanded();\r
+                                       }\r
+                               },\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visitGroup(this);\r
+                               },\r
+\r
+                               reverseChildren: function() {\r
+                                       if (this.rendered) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].reverseChildren();\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               update: function() {\r
+                                       var previouslyExpandable = this.expandable;\r
+                                       this.expandable = (this.children.length !== 0);\r
+                                       if (this.expandable !== previouslyExpandable) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].update();\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               flatten: function() {\r
+                                       var visitor = new GroupFlattener();\r
+                                       this.accept(visitor);\r
+                                       return visitor.logEntriesAndSeparators;\r
+                               },\r
+\r
+                               removeChild: function(child, doUpdate) {\r
+                                       array_remove(this.children, child);\r
+                                       child.group = null;\r
+                                       if (doUpdate) {\r
+                                               this.update();\r
+                                       }\r
+                               },\r
+\r
+                               remove: function(doUpdate, removeFromGroup) {\r
+                                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                                               this.children[i].remove(false, false);\r
+                                       }\r
+                                       this.children = [];\r
+                                       this.update();\r
+                                       if (this === currentGroup) {\r
+                                               currentGroup = this.group;\r
+                                       }\r
+                                       this.doRemove(doUpdate, removeFromGroup);\r
+                               },\r
+\r
+                               serialize: function(items) {\r
+                                       items.push([LogItem.serializedItemKeys.GROUP_START, this.name]);\r
+                                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                                               this.children[i].serialize(items);\r
+                                       }\r
+                                       if (this !== currentGroup) {\r
+                                               items.push([LogItem.serializedItemKeys.GROUP_END]);\r
+                                       }\r
+                               },\r
+\r
+                               clear: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].clear();\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryElementContainer() {\r
+                       }\r
+\r
+                       LogEntryElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       copyProperties(LogEntryElementContainer.prototype, {\r
+                               remove: function() {\r
+                                       this.doRemove();\r
+                               },\r
+\r
+                               doRemove: function() {\r
+                                       this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                                       this.mainDiv = null;\r
+                                       this.contentElement = null;\r
+                                       this.containerDomNode = null;\r
+                               },\r
+\r
+                               setContent: function(content, wrappedContent) {\r
+                                       if (content === this.formattedMessage) {\r
+                                               this.contentElement.innerHTML = "";\r
+                                               this.contentElement.appendChild(document.createTextNode(this.formattedMessage));\r
+                                       } else {\r
+                                               this.contentElement.innerHTML = content;\r
+                                       }\r
+                               },\r
+\r
+                               setSearchMatch: function(isMatch) {\r
+                                       var oldCssClass = isMatch ? "searchnonmatch" : "searchmatch";\r
+                                       var newCssClass = isMatch ? "searchmatch" : "searchnonmatch";\r
+                                       replaceClass(this.mainDiv, newCssClass, oldCssClass);\r
+                               },\r
+\r
+                               clearSearch: function() {\r
+                                       removeClass(this.mainDiv, "searchmatch");\r
+                                       removeClass(this.mainDiv, "searchnonmatch");\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryWrappedElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                               this.mainDiv.className = "logentry wrapped " + this.logEntry.level;\r
+                               this.contentElement = this.mainDiv;\r
+                       }\r
+\r
+                       LogEntryWrappedElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       LogEntryWrappedElementContainer.prototype.setContent = function(content, wrappedContent) {\r
+                               if (content === this.formattedMessage) {\r
+                                       this.contentElement.innerHTML = "";\r
+                                       this.contentElement.appendChild(document.createTextNode(this.formattedMessage));\r
+                               } else {\r
+                                       this.contentElement.innerHTML = wrappedContent;\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryUnwrappedElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "logentry unwrapped " + this.logEntry.level;\r
+                               this.pre = this.mainDiv.appendChild(document.createElement("pre"));\r
+                               this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                               this.pre.className = "unwrapped";\r
+                               this.contentElement = this.pre;\r
+                       }\r
+\r
+                       LogEntryUnwrappedElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       LogEntryUnwrappedElementContainer.prototype.remove = function() {\r
+                               this.doRemove();\r
+                               this.pre = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryMainElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "logentry nonielogentry " + this.logEntry.level;\r
+                               this.contentElement = this.mainDiv.appendChild(document.createElement("span"));\r
+                               this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                       }\r
+\r
+                       LogEntryMainElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntry(level, formattedMessage) {\r
+                               this.level = level;\r
+                               this.formattedMessage = formattedMessage;\r
+                               this.rendered = false;\r
+                       }\r
+\r
+                       LogEntry.prototype = new LogItem();\r
+\r
+                       copyProperties(LogEntry.prototype, {\r
+                               render: function() {\r
+                                       var logEntry = this;\r
+                                       var containerDomNode = this.group.contentDiv;\r
+\r
+                                       // Support for the CSS attribute white-space in IE for Windows is\r
+                                       // non-existent pre version 6 and slightly odd in 6, so instead\r
+                                       // use two different HTML elements\r
+                                       if (isIe) {\r
+                                               this.formattedMessage = this.formattedMessage.replace(/\r\n/g, "\r"); // Workaround for IE's treatment of white space\r
+                                               this.unwrappedElementContainer = new LogEntryUnwrappedElementContainer(this, this.getUnwrappedDomContainer());\r
+                                               this.wrappedElementContainer = new LogEntryWrappedElementContainer(this, this.getWrappedDomContainer());\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               this.mainElementContainer = new LogEntryMainElementContainer(this, this.getMainDomContainer());\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.content = this.formattedMessage;\r
+                                       this.rendered = true;\r
+                               },\r
+\r
+                               setContent: function(content, wrappedContent) {\r
+                                       if (content != this.content) {\r
+                                               if (isIe && (content !== this.formattedMessage)) {\r
+                                                       content = content.replace(/\r\n/g, "\r"); // Workaround for IE's treatment of white space\r
+                                               }\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].setContent(content, wrappedContent);\r
+                                               }\r
+                                               this.content = content;\r
+                                       }\r
+                               },\r
+\r
+                               getSearchMatches: function() {\r
+                                       var matches = [];\r
+                                       var i, len;\r
+                                       if (isIe) {\r
+                                               var unwrappedEls = getElementsByClass(this.unwrappedElementContainer.mainDiv, "searchterm", "span");\r
+                                               var wrappedEls = getElementsByClass(this.wrappedElementContainer.mainDiv, "searchterm", "span");\r
+                                               for (i = 0, len = unwrappedEls.length; i < len; i++) {\r
+                                                       matches[i] = new Match(this.level, null, unwrappedEls[i], wrappedEls[i]);\r
+                                               }\r
+                                       } else {\r
+                                               var els = getElementsByClass(this.mainElementContainer.mainDiv, "searchterm", "span");\r
+                                               for (i = 0, len = els.length; i < len; i++) {\r
+                                                       matches[i] = new Match(this.level, els[i]);\r
+                                               }\r
+                                       }\r
+                                       return matches;\r
+                               },\r
+\r
+                               setSearchMatch: function(isMatch) {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].setSearchMatch(isMatch);\r
+                                       }\r
+                               },\r
+\r
+                               clearSearch: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].clearSearch();\r
+                                       }\r
+                               },\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visitLogEntry(this);\r
+                               },\r
+\r
+                               serialize: function(items) {\r
+                                       items.push([LogItem.serializedItemKeys.LOG_ENTRY, this.level, this.formattedMessage]);\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemVisitor() {\r
+                       }\r
+\r
+                       LogItemVisitor.prototype = {\r
+                               visit: function(logItem) {\r
+                               },\r
+\r
+                               visitParent: function(logItem) {\r
+                                       if (logItem.group) {\r
+                                               logItem.group.accept(this);\r
+                                       }\r
+                               },\r
+\r
+                               visitChildren: function(logItem) {\r
+                                       for (var i = 0, len = logItem.children.length; i < len; i++) {\r
+                                               logItem.children[i].accept(this);\r
+                                       }\r
+                               },\r
+\r
+                               visitLogEntry: function(logEntry) {\r
+                                       this.visit(logEntry);\r
+                               },\r
+\r
+                               visitSeparator: function(separator) {\r
+                                       this.visit(separator);\r
+                               },\r
+\r
+                               visitGroup: function(group) {\r
+                                       this.visit(group);\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function GroupFlattener() {\r
+                               this.logEntriesAndSeparators = [];\r
+                       }\r
+\r
+                       GroupFlattener.prototype = new LogItemVisitor();\r
+\r
+                       GroupFlattener.prototype.visitGroup = function(group) {\r
+                               this.visitChildren(group);\r
+                       };\r
+\r
+                       GroupFlattener.prototype.visitLogEntry = function(logEntry) {\r
+                               this.logEntriesAndSeparators.push(logEntry);\r
+                       };\r
+\r
+                       GroupFlattener.prototype.visitSeparator = function(separator) {\r
+                               this.logEntriesAndSeparators.push(separator);\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       window.onload = function() {\r
+                               // Sort out document.domain\r
+                               if (location.search) {\r
+                                       var queryBits = unescape(location.search).substr(1).split("&"), nameValueBits;\r
+                                       for (var i = 0, len = queryBits.length; i < len; i++) {\r
+                                               nameValueBits = queryBits[i].split("=");\r
+                                               if (nameValueBits[0] == "log4javascript_domain") {\r
+                                                       document.domain = nameValueBits[1];\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Create DOM objects\r
+                               logMainContainer = $("log");\r
+                               if (isIePre7) {\r
+                                       addClass(logMainContainer, "oldIe");\r
+                               }\r
+\r
+                               rootGroup = new Group("root", true);\r
+                               rootGroup.render();\r
+                               currentGroup = rootGroup;\r
+                               \r
+                               setCommandInputWidth();\r
+                               setLogContainerHeight();\r
+                               toggleLoggingEnabled();\r
+                               toggleSearchEnabled();\r
+                               toggleSearchFilter();\r
+                               toggleSearchHighlight();\r
+                               applyFilters();\r
+                               checkAllLevels();\r
+                               toggleWrap();\r
+                               toggleNewestAtTop();\r
+                               toggleScrollToLatest();\r
+                               renderQueuedLogItems();\r
+                               loaded = true;\r
+                               $("command").value = "";\r
+                               $("command").autocomplete = "off";\r
+                               $("command").onkeydown = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 10 || evt.keyCode == 13) { // Return/Enter\r
+                                               evalCommandLine();\r
+                                               stopPropagation(evt);\r
+                                       } else if (evt.keyCode == 27) { // Escape\r
+                                               this.value = "";\r
+                                               this.focus();\r
+                                       } else if (evt.keyCode == 38 && commandHistory.length > 0) { // Up\r
+                                               currentCommandIndex = Math.max(0, currentCommandIndex - 1);\r
+                                               this.value = commandHistory[currentCommandIndex];\r
+                                               moveCaretToEnd(this);\r
+                                       } else if (evt.keyCode == 40 && commandHistory.length > 0) { // Down\r
+                                               currentCommandIndex = Math.min(commandHistory.length - 1, currentCommandIndex + 1);\r
+                                               this.value = commandHistory[currentCommandIndex];\r
+                                               moveCaretToEnd(this);\r
+                                       }\r
+                               };\r
+\r
+                               // Prevent the keypress moving the caret in Firefox\r
+                               $("command").onkeypress = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 38 && commandHistory.length > 0 && evt.preventDefault) { // Up\r
+                                               evt.preventDefault();\r
+                                       }\r
+                               };\r
+\r
+                               // Prevent the keyup event blurring the input in Opera\r
+                               $("command").onkeyup = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 27 && evt.preventDefault) { // Up\r
+                                               evt.preventDefault();\r
+                                               this.focus();\r
+                                       }\r
+                               };\r
+\r
+                               // Add document keyboard shortcuts\r
+                               document.onkeydown = function keyEventHandler(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       switch (evt.keyCode) {\r
+                                               case 69: // Ctrl + shift + E: re-execute last command\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               evalLastCommand();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                               case 75: // Ctrl + shift + K: focus search\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               focusSearch();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                               case 40: // Ctrl + shift + down arrow: focus command line\r
+                                               case 76: // Ctrl + shift + L: focus command line\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               focusCommandLine();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                       }\r
+                               };\r
+\r
+                               // Workaround to make sure log div starts at the correct size\r
+                               setTimeout(setLogContainerHeight, 20);\r
+\r
+                               setShowCommandLine(showCommandLine);\r
+                               doSearch();\r
+                       };\r
+\r
+                       window.onunload = function() {\r
+                               if (mainWindowExists()) {\r
+                                       appender.unload();\r
+                               }\r
+                               appender = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function toggleLoggingEnabled() {\r
+                               setLoggingEnabled($("enableLogging").checked);\r
+                       }\r
+\r
+                       function setLoggingEnabled(enable) {\r
+                               loggingEnabled = enable;\r
+                       }\r
+\r
+                       var appender = null;\r
+\r
+                       function setAppender(appenderParam) {\r
+                               appender = appenderParam;\r
+                       }\r
+\r
+                       function setShowCloseButton(showCloseButton) {\r
+                               $("closeButton").style.display = showCloseButton ? "inline" : "none";\r
+                       }\r
+\r
+                       function setShowHideButton(showHideButton) {\r
+                               $("hideButton").style.display = showHideButton ? "inline" : "none";\r
+                       }\r
+\r
+                       var newestAtTop = false;\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemContentReverser() {\r
+                       }\r
+                       \r
+                       LogItemContentReverser.prototype = new LogItemVisitor();\r
+                       \r
+                       LogItemContentReverser.prototype.visitGroup = function(group) {\r
+                               group.reverseChildren();\r
+                               this.visitChildren(group);\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function setNewestAtTop(isNewestAtTop) {\r
+                               var oldNewestAtTop = newestAtTop;\r
+                               var i, iLen, j, jLen;\r
+                               newestAtTop = Boolean(isNewestAtTop);\r
+                               if (oldNewestAtTop != newestAtTop) {\r
+                                       var visitor = new LogItemContentReverser();\r
+                                       rootGroup.accept(visitor);\r
+\r
+                                       // Reassemble the matches array\r
+                                       if (currentSearch) {\r
+                                               var currentMatch = currentSearch.matches[currentMatchIndex];\r
+                                               var matchIndex = 0;\r
+                                               var matches = [];\r
+                                               var actOnLogEntry = function(logEntry) {\r
+                                                       var logEntryMatches = logEntry.getSearchMatches();\r
+                                                       for (j = 0, jLen = logEntryMatches.length; j < jLen; j++) {\r
+                                                               matches[matchIndex] = logEntryMatches[j];\r
+                                                               if (currentMatch && logEntryMatches[j].equals(currentMatch)) {\r
+                                                                       currentMatchIndex = matchIndex;\r
+                                                               }\r
+                                                               matchIndex++;\r
+                                                       }\r
+                                               };\r
+                                               if (newestAtTop) {\r
+                                                       for (i = logEntries.length - 1; i >= 0; i--) {\r
+                                                               actOnLogEntry(logEntries[i]);\r
+                                                       }\r
+                                               } else {\r
+                                                       for (i = 0, iLen = logEntries.length; i < iLen; i++) {\r
+                                                               actOnLogEntry(logEntries[i]);\r
+                                                       }\r
+                                               }\r
+                                               currentSearch.matches = matches;\r
+                                               if (currentMatch) {\r
+                                                       currentMatch.setCurrent();\r
+                                               }\r
+                                       } else if (scrollToLatest) {\r
+                                               doScrollToLatest();\r
+                                       }\r
+                               }\r
+                               $("newestAtTop").checked = isNewestAtTop;\r
+                       }\r
+\r
+                       function toggleNewestAtTop() {\r
+                               var isNewestAtTop = $("newestAtTop").checked;\r
+                               setNewestAtTop(isNewestAtTop);\r
+                       }\r
+\r
+                       var scrollToLatest = true;\r
+\r
+                       function setScrollToLatest(isScrollToLatest) {\r
+                               scrollToLatest = isScrollToLatest;\r
+                               if (scrollToLatest) {\r
+                                       doScrollToLatest();\r
+                               }\r
+                               $("scrollToLatest").checked = isScrollToLatest;\r
+                       }\r
+\r
+                       function toggleScrollToLatest() {\r
+                               var isScrollToLatest = $("scrollToLatest").checked;\r
+                               setScrollToLatest(isScrollToLatest);\r
+                       }\r
+\r
+                       function doScrollToLatest() {\r
+                               var l = logMainContainer;\r
+                               if (typeof l.scrollTop != "undefined") {\r
+                                       if (newestAtTop) {\r
+                                               l.scrollTop = 0;\r
+                                       } else {\r
+                                               var latestLogEntry = l.lastChild;\r
+                                               if (latestLogEntry) {\r
+                                                       l.scrollTop = l.scrollHeight;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       var closeIfOpenerCloses = true;\r
+\r
+                       function setCloseIfOpenerCloses(isCloseIfOpenerCloses) {\r
+                               closeIfOpenerCloses = isCloseIfOpenerCloses;\r
+                       }\r
+\r
+                       var maxMessages = null;\r
+\r
+                       function setMaxMessages(max) {\r
+                               maxMessages = max;\r
+                               pruneLogEntries();\r
+                       }\r
+\r
+                       var showCommandLine = false;\r
+\r
+                       function setShowCommandLine(isShowCommandLine) {\r
+                               showCommandLine = isShowCommandLine;\r
+                               if (loaded) {\r
+                                       $("commandLine").style.display = showCommandLine ? "block" : "none";\r
+                                       setCommandInputWidth();\r
+                                       setLogContainerHeight();\r
+                               }\r
+                       }\r
+\r
+                       function focusCommandLine() {\r
+                               if (loaded) {\r
+                                       $("command").focus();\r
+                               }\r
+                       }\r
+\r
+                       function focusSearch() {\r
+                               if (loaded) {\r
+                                       $("searchBox").focus();\r
+                               }\r
+                       }\r
+\r
+                       function getLogItems() {\r
+                               var items = [];\r
+                               for (var i = 0, len = logItems.length; i < len; i++) {\r
+                                       logItems[i].serialize(items);\r
+                               }\r
+                               return items;\r
+                       }\r
+\r
+                       function setLogItems(items) {\r
+                               var loggingReallyEnabled = loggingEnabled;\r
+                               // Temporarily turn logging on\r
+                               loggingEnabled = true;\r
+                               for (var i = 0, len = items.length; i < len; i++) {\r
+                                       switch (items[i][0]) {\r
+                                               case LogItem.serializedItemKeys.LOG_ENTRY:\r
+                                                       log(items[i][1], items[i][2]);\r
+                                                       break;\r
+                                               case LogItem.serializedItemKeys.GROUP_START:\r
+                                                       group(items[i][1]);\r
+                                                       break;\r
+                                               case LogItem.serializedItemKeys.GROUP_END:\r
+                                                       groupEnd();\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               loggingEnabled = loggingReallyEnabled;\r
+                       }\r
+\r
+                       function log(logLevel, formattedMessage) {\r
+                               if (loggingEnabled) {\r
+                                       var logEntry = new LogEntry(logLevel, formattedMessage);\r
+                                       logEntries.push(logEntry);\r
+                                       logEntriesAndSeparators.push(logEntry);\r
+                                       logItems.push(logEntry);\r
+                                       currentGroup.addChild(logEntry);\r
+                                       if (loaded) {\r
+                                               if (logQueuedEventsTimer !== null) {\r
+                                                       clearTimeout(logQueuedEventsTimer);\r
+                                               }\r
+                                               logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);\r
+                                               unrenderedLogItemsExist = true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function renderQueuedLogItems() {\r
+                               logQueuedEventsTimer = null;\r
+                               var pruned = pruneLogEntries();\r
+\r
+                               // Render any unrendered log entries and apply the current search to them\r
+                               var initiallyHasMatches = currentSearch ? currentSearch.hasMatches() : false;\r
+                               for (var i = 0, len = logItems.length; i < len; i++) {\r
+                                       if (!logItems[i].rendered) {\r
+                                               logItems[i].render();\r
+                                               logItems[i].appendToLog();\r
+                                               if (currentSearch && (logItems[i] instanceof LogEntry)) {\r
+                                                       currentSearch.applyTo(logItems[i]);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if (currentSearch) {\r
+                                       if (pruned) {\r
+                                               if (currentSearch.hasVisibleMatches()) {\r
+                                                       if (currentMatchIndex === null) {\r
+                                                               setCurrentMatchIndex(0);\r
+                                                       }\r
+                                                       displayMatches();\r
+                                               } else {\r
+                                                       displayNoMatches();\r
+                                               }\r
+                                       } else if (!initiallyHasMatches && currentSearch.hasVisibleMatches()) {\r
+                                               setCurrentMatchIndex(0);\r
+                                               displayMatches();\r
+                                       }\r
+                               }\r
+                               if (scrollToLatest) {\r
+                                       doScrollToLatest();\r
+                               }\r
+                               unrenderedLogItemsExist = false;\r
+                       }\r
+\r
+                       function pruneLogEntries() {\r
+                               if ((maxMessages !== null) && (logEntriesAndSeparators.length > maxMessages)) {\r
+                                       var numberToDelete = logEntriesAndSeparators.length - maxMessages;\r
+                                       var prunedLogEntries = logEntriesAndSeparators.slice(0, numberToDelete);\r
+                                       if (currentSearch) {\r
+                                               currentSearch.removeMatches(prunedLogEntries);\r
+                                       }\r
+                                       var group;\r
+                                       for (var i = 0; i < numberToDelete; i++) {\r
+                                               group = logEntriesAndSeparators[i].group;\r
+                                               array_remove(logItems, logEntriesAndSeparators[i]);\r
+                                               array_remove(logEntries, logEntriesAndSeparators[i]);\r
+                                               logEntriesAndSeparators[i].remove(true, true);\r
+                                               if (group.children.length === 0 && group !== currentGroup && group !== rootGroup) {\r
+                                                       array_remove(logItems, group);\r
+                                                       group.remove(true, true);\r
+                                               }\r
+                                       }\r
+                                       logEntriesAndSeparators = array_removeFromStart(logEntriesAndSeparators, numberToDelete);\r
+                                       return true;\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function group(name, startExpanded) {\r
+                               if (loggingEnabled) {\r
+                                       initiallyExpanded = (typeof startExpanded === "undefined") ? true : Boolean(startExpanded);\r
+                                       var newGroup = new Group(name, false, initiallyExpanded);\r
+                                       currentGroup.addChild(newGroup);\r
+                                       currentGroup = newGroup;\r
+                                       logItems.push(newGroup);\r
+                                       if (loaded) {\r
+                                               if (logQueuedEventsTimer !== null) {\r
+                                                       clearTimeout(logQueuedEventsTimer);\r
+                                               }\r
+                                               logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);\r
+                                               unrenderedLogItemsExist = true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function groupEnd() {\r
+                               currentGroup = (currentGroup === rootGroup) ? rootGroup : currentGroup.group;\r
+                       }\r
+\r
+                       function mainPageReloaded() {\r
+                               currentGroup = rootGroup;\r
+                               var separator = new Separator();\r
+                               logEntriesAndSeparators.push(separator);\r
+                               logItems.push(separator);\r
+                               currentGroup.addChild(separator);\r
+                       }\r
+\r
+                       function closeWindow() {\r
+                               if (appender && mainWindowExists()) {\r
+                                       appender.close(true);\r
+                               } else {\r
+                                       window.close();\r
+                               }\r
+                       }\r
+\r
+                       function hide() {\r
+                               if (appender && mainWindowExists()) {\r
+                                       appender.hide();\r
+                               }\r
+                       }\r
+\r
+                       var mainWindow = window;\r
+                       var windowId = "log4javascriptConsoleWindow_" + new Date().getTime() + "_" + ("" + Math.random()).substr(2);\r
+\r
+                       function setMainWindow(win) {\r
+                               mainWindow = win;\r
+                               mainWindow[windowId] = window;\r
+                               // If this is a pop-up, poll the opener to see if it's closed\r
+                               if (opener && closeIfOpenerCloses) {\r
+                                       pollOpener();\r
+                               }\r
+                       }\r
+\r
+                       function pollOpener() {\r
+                               if (closeIfOpenerCloses) {\r
+                                       if (mainWindowExists()) {\r
+                                               setTimeout(pollOpener, 500);\r
+                                       } else {\r
+                                               closeWindow();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function mainWindowExists() {\r
+                               try {\r
+                                       return (mainWindow && !mainWindow.closed &&\r
+                                               mainWindow[windowId] == window);\r
+                               } catch (ex) {}\r
+                               return false;\r
+                       }\r
+\r
+                       var logLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];\r
+\r
+                       function getCheckBox(logLevel) {\r
+                               return $("switch_" + logLevel);\r
+                       }\r
+\r
+                       function getIeWrappedLogContainer() {\r
+                               return $("log_wrapped");\r
+                       }\r
+\r
+                       function getIeUnwrappedLogContainer() {\r
+                               return $("log_unwrapped");\r
+                       }\r
+\r
+                       function applyFilters() {\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       if (getCheckBox(logLevels[i]).checked) {\r
+                                               addClass(logMainContainer, logLevels[i]);\r
+                                       } else {\r
+                                               removeClass(logMainContainer, logLevels[i]);\r
+                                       }\r
+                               }\r
+                               updateSearchFromFilters();\r
+                       }\r
+\r
+                       function toggleAllLevels() {\r
+                               var turnOn = $("switch_ALL").checked;\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       getCheckBox(logLevels[i]).checked = turnOn;\r
+                                       if (turnOn) {\r
+                                               addClass(logMainContainer, logLevels[i]);\r
+                                       } else {\r
+                                               removeClass(logMainContainer, logLevels[i]);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function checkAllLevels() {\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       if (!getCheckBox(logLevels[i]).checked) {\r
+                                               getCheckBox("ALL").checked = false;\r
+                                               return;\r
+                                       }\r
+                               }\r
+                               getCheckBox("ALL").checked = true;\r
+                       }\r
+\r
+                       function clearLog() {\r
+                               rootGroup.clear();\r
+                               currentGroup = rootGroup;\r
+                               logEntries = [];\r
+                               logItems = [];\r
+                               logEntriesAndSeparators = [];\r
+                               doSearch();\r
+                       }\r
+\r
+                       function toggleWrap() {\r
+                               var enable = $("wrap").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "wrap");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "wrap");\r
+                               }\r
+                               refreshCurrentMatch();\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------- */\r
+\r
+                       // Search\r
+\r
+                       var searchTimer = null;\r
+\r
+                       function scheduleSearch() {\r
+                               try {\r
+                                       clearTimeout(searchTimer);\r
+                               } catch (ex) {\r
+                                       // Do nothing\r
+                               }\r
+                               searchTimer = setTimeout(doSearch, 500);\r
+                       }\r
+\r
+                       function Search(searchTerm, isRegex, searchRegex, isCaseSensitive) {\r
+                               this.searchTerm = searchTerm;\r
+                               this.isRegex = isRegex;\r
+                               this.searchRegex = searchRegex;\r
+                               this.isCaseSensitive = isCaseSensitive;\r
+                               this.matches = [];\r
+                       }\r
+\r
+                       Search.prototype = {\r
+                               hasMatches: function() {\r
+                                       return this.matches.length > 0;\r
+                               },\r
+\r
+                               hasVisibleMatches: function() {\r
+                                       if (this.hasMatches()) {\r
+                                               for (var i = 0; i < this.matches.length; i++) {\r
+                                                       if (this.matches[i].isVisible()) {\r
+                                                               return true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       return false;\r
+                               },\r
+\r
+                               match: function(logEntry) {\r
+                                       var entryText = String(logEntry.formattedMessage);\r
+                                       var matchesSearch = false;\r
+                                       if (this.isRegex) {\r
+                                               matchesSearch = this.searchRegex.test(entryText);\r
+                                       } else if (this.isCaseSensitive) {\r
+                                               matchesSearch = (entryText.indexOf(this.searchTerm) > -1);\r
+                                       } else {\r
+                                               matchesSearch = (entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);\r
+                                       }\r
+                                       return matchesSearch;\r
+                               },\r
+\r
+                               getNextVisibleMatchIndex: function() {\r
+                                       for (var i = currentMatchIndex + 1; i < this.matches.length; i++) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       // Start again from the first match\r
+                                       for (i = 0; i <= currentMatchIndex; i++) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       return -1;\r
+                               },\r
+\r
+                               getPreviousVisibleMatchIndex: function() {\r
+                                       for (var i = currentMatchIndex - 1; i >= 0; i--) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       // Start again from the last match\r
+                                       for (var i = this.matches.length - 1; i >= currentMatchIndex; i--) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       return -1;\r
+                               },\r
+\r
+                               applyTo: function(logEntry) {\r
+                                       var doesMatch = this.match(logEntry);\r
+                                       if (doesMatch) {\r
+                                               logEntry.group.expand();\r
+                                               logEntry.setSearchMatch(true);\r
+                                               var logEntryContent;\r
+                                               var wrappedLogEntryContent;\r
+                                               var searchTermReplacementStartTag = "<span class=\"searchterm\">";\r
+                                               var searchTermReplacementEndTag = "<" + "/span>";\r
+                                               var preTagName = isIe ? "pre" : "span";\r
+                                               var preStartTag = "<" + preTagName + " class=\"pre\">";\r
+                                               var preEndTag = "<" + "/" + preTagName + ">";\r
+                                               var startIndex = 0;\r
+                                               var searchIndex, matchedText, textBeforeMatch;\r
+                                               if (this.isRegex) {\r
+                                                       var flags = this.isCaseSensitive ? "g" : "gi";\r
+                                                       var capturingRegex = new RegExp("(" + this.searchRegex.source + ")", flags);\r
+\r
+                                                       // Replace the search term with temporary tokens for the start and end tags\r
+                                                       var rnd = ("" + Math.random()).substr(2);\r
+                                                       var startToken = "%%s" + rnd + "%%";\r
+                                                       var endToken = "%%e" + rnd + "%%";\r
+                                                       logEntryContent = logEntry.formattedMessage.replace(capturingRegex, startToken + "$1" + endToken);\r
+\r
+                                                       // Escape the HTML to get rid of angle brackets\r
+                                                       logEntryContent = escapeHtml(logEntryContent);\r
+\r
+                                                       // Substitute the proper HTML back in for the search match\r
+                                                       var result;\r
+                                                       var searchString = logEntryContent;\r
+                                                       logEntryContent = "";\r
+                                                       wrappedLogEntryContent = "";\r
+                                                       while ((searchIndex = searchString.indexOf(startToken, startIndex)) > -1) {\r
+                                                               var endTokenIndex = searchString.indexOf(endToken, searchIndex);\r
+                                                               matchedText = searchString.substring(searchIndex + startToken.length, endTokenIndex);\r
+                                                               textBeforeMatch = searchString.substring(startIndex, searchIndex);\r
+                                                               logEntryContent += preStartTag + textBeforeMatch + preEndTag;\r
+                                                               logEntryContent += searchTermReplacementStartTag + preStartTag + matchedText +\r
+                                                                       preEndTag + searchTermReplacementEndTag;\r
+                                                               if (isIe) {\r
+                                                                       wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +\r
+                                                                               matchedText + searchTermReplacementEndTag;\r
+                                                               }\r
+                                                               startIndex = endTokenIndex + endToken.length;\r
+                                                       }\r
+                                                       logEntryContent += preStartTag + searchString.substr(startIndex) + preEndTag;\r
+                                                       if (isIe) {\r
+                                                               wrappedLogEntryContent += searchString.substr(startIndex);\r
+                                                       }\r
+                                               } else {\r
+                                                       logEntryContent = "";\r
+                                                       wrappedLogEntryContent = "";\r
+                                                       var searchTermReplacementLength = searchTermReplacementStartTag.length +\r
+                                                               this.searchTerm.length + searchTermReplacementEndTag.length;\r
+                                                       var searchTermLength = this.searchTerm.length;\r
+                                                       var searchTermLowerCase = this.searchTerm.toLowerCase();\r
+                                                       var logTextLowerCase = logEntry.formattedMessage.toLowerCase();\r
+                                                       while ((searchIndex = logTextLowerCase.indexOf(searchTermLowerCase, startIndex)) > -1) {\r
+                                                               matchedText = escapeHtml(logEntry.formattedMessage.substr(searchIndex, this.searchTerm.length));\r
+                                                               textBeforeMatch = escapeHtml(logEntry.formattedMessage.substring(startIndex, searchIndex));\r
+                                                               var searchTermReplacement = searchTermReplacementStartTag +\r
+                                                                       preStartTag + matchedText + preEndTag + searchTermReplacementEndTag;\r
+                                                               logEntryContent += preStartTag + textBeforeMatch + preEndTag + searchTermReplacement;\r
+                                                               if (isIe) {\r
+                                                                       wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +\r
+                                                                               matchedText + searchTermReplacementEndTag;\r
+                                                               }\r
+                                                               startIndex = searchIndex + searchTermLength;\r
+                                                       }\r
+                                                       var textAfterLastMatch = escapeHtml(logEntry.formattedMessage.substr(startIndex));\r
+                                                       logEntryContent += preStartTag + textAfterLastMatch + preEndTag;\r
+                                                       if (isIe) {\r
+                                                               wrappedLogEntryContent += textAfterLastMatch;\r
+                                                       }\r
+                                               }\r
+                                               logEntry.setContent(logEntryContent, wrappedLogEntryContent);\r
+                                               var logEntryMatches = logEntry.getSearchMatches();\r
+                                               this.matches = this.matches.concat(logEntryMatches);\r
+                                       } else {\r
+                                               logEntry.setSearchMatch(false);\r
+                                               logEntry.setContent(logEntry.formattedMessage, logEntry.formattedMessage);\r
+                                       }\r
+                                       return doesMatch;\r
+                               },\r
+\r
+                               removeMatches: function(logEntries) {\r
+                                       var matchesToRemoveCount = 0;\r
+                                       var currentMatchRemoved = false;\r
+                                       var matchesToRemove = [];\r
+                                       var i, iLen, j, jLen;\r
+\r
+                                       // Establish the list of matches to be removed\r
+                                       for (i = 0, iLen = this.matches.length; i < iLen; i++) {\r
+                                               for (j = 0, jLen = logEntries.length; j < jLen; j++) {\r
+                                                       if (this.matches[i].belongsTo(logEntries[j])) {\r
+                                                               matchesToRemove.push(this.matches[i]);\r
+                                                               if (i === currentMatchIndex) {\r
+                                                                       currentMatchRemoved = true;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Set the new current match index if the current match has been deleted\r
+                                       // This will be the first match that appears after the first log entry being\r
+                                       // deleted, if one exists; otherwise, it's the first match overall\r
+                                       var newMatch = currentMatchRemoved ? null : this.matches[currentMatchIndex];\r
+                                       if (currentMatchRemoved) {\r
+                                               for (i = currentMatchIndex, iLen = this.matches.length; i < iLen; i++) {\r
+                                                       if (this.matches[i].isVisible() && !array_contains(matchesToRemove, this.matches[i])) {\r
+                                                               newMatch = this.matches[i];\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Remove the matches\r
+                                       for (i = 0, iLen = matchesToRemove.length; i < iLen; i++) {\r
+                                               array_remove(this.matches, matchesToRemove[i]);\r
+                                               matchesToRemove[i].remove();\r
+                                       }\r
+\r
+                                       // Set the new match, if one exists\r
+                                       if (this.hasVisibleMatches()) {\r
+                                               if (newMatch === null) {\r
+                                                       setCurrentMatchIndex(0);\r
+                                               } else {\r
+                                                       // Get the index of the new match\r
+                                                       var newMatchIndex = 0;\r
+                                                       for (i = 0, iLen = this.matches.length; i < iLen; i++) {\r
+                                                               if (newMatch === this.matches[i]) {\r
+                                                                       newMatchIndex = i;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                                       setCurrentMatchIndex(newMatchIndex);\r
+                                               }\r
+                                       } else {\r
+                                               currentMatchIndex = null;\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       function getPageOffsetTop(el, container) {\r
+                               var currentEl = el;\r
+                               var y = 0;\r
+                               while (currentEl && currentEl != container) {\r
+                                       y += currentEl.offsetTop;\r
+                                       currentEl = currentEl.offsetParent;\r
+                               }\r
+                               return y;\r
+                       }\r
+\r
+                       function scrollIntoView(el) {\r
+                               var logContainer = logMainContainer;\r
+                               // Check if the whole width of the element is visible and centre if not\r
+                               if (!$("wrap").checked) {\r
+                                       var logContainerLeft = logContainer.scrollLeft;\r
+                                       var logContainerRight = logContainerLeft  + logContainer.offsetWidth;\r
+                                       var elLeft = el.offsetLeft;\r
+                                       var elRight = elLeft + el.offsetWidth;\r
+                                       if (elLeft < logContainerLeft || elRight > logContainerRight) {\r
+                                               logContainer.scrollLeft = elLeft - (logContainer.offsetWidth - el.offsetWidth) / 2;\r
+                                       }\r
+                               }\r
+                               // Check if the whole height of the element is visible and centre if not\r
+                               var logContainerTop = logContainer.scrollTop;\r
+                               var logContainerBottom = logContainerTop  + logContainer.offsetHeight;\r
+                               var elTop = getPageOffsetTop(el) - getToolBarsHeight();\r
+                               var elBottom = elTop + el.offsetHeight;\r
+                               if (elTop < logContainerTop || elBottom > logContainerBottom) {\r
+                                       logContainer.scrollTop = elTop - (logContainer.offsetHeight - el.offsetHeight) / 2;\r
+                               }\r
+                       }\r
+\r
+                       function Match(logEntryLevel, spanInMainDiv, spanInUnwrappedPre, spanInWrappedDiv) {\r
+                               this.logEntryLevel = logEntryLevel;\r
+                               this.spanInMainDiv = spanInMainDiv;\r
+                               if (isIe) {\r
+                                       this.spanInUnwrappedPre = spanInUnwrappedPre;\r
+                                       this.spanInWrappedDiv = spanInWrappedDiv;\r
+                               }\r
+                               this.mainSpan = isIe ? spanInUnwrappedPre : spanInMainDiv;\r
+                       }\r
+\r
+                       Match.prototype = {\r
+                               equals: function(match) {\r
+                                       return this.mainSpan === match.mainSpan;\r
+                               },\r
+\r
+                               setCurrent: function() {\r
+                                       if (isIe) {\r
+                                               addClass(this.spanInUnwrappedPre, "currentmatch");\r
+                                               addClass(this.spanInWrappedDiv, "currentmatch");\r
+                                               // Scroll the visible one into view\r
+                                               var elementToScroll = $("wrap").checked ? this.spanInWrappedDiv : this.spanInUnwrappedPre;\r
+                                               scrollIntoView(elementToScroll);\r
+                                       } else {\r
+                                               addClass(this.spanInMainDiv, "currentmatch");\r
+                                               scrollIntoView(this.spanInMainDiv);\r
+                                       }\r
+                               },\r
+\r
+                               belongsTo: function(logEntry) {\r
+                                       if (isIe) {\r
+                                               return isDescendant(this.spanInUnwrappedPre, logEntry.unwrappedPre);\r
+                                       } else {\r
+                                               return isDescendant(this.spanInMainDiv, logEntry.mainDiv);\r
+                                       }\r
+                               },\r
+\r
+                               setNotCurrent: function() {\r
+                                       if (isIe) {\r
+                                               removeClass(this.spanInUnwrappedPre, "currentmatch");\r
+                                               removeClass(this.spanInWrappedDiv, "currentmatch");\r
+                                       } else {\r
+                                               removeClass(this.spanInMainDiv, "currentmatch");\r
+                                       }\r
+                               },\r
+\r
+                               isOrphan: function() {\r
+                                       return isOrphan(this.mainSpan);\r
+                               },\r
+\r
+                               isVisible: function() {\r
+                                       return getCheckBox(this.logEntryLevel).checked;\r
+                               },\r
+\r
+                               remove: function() {\r
+                                       if (isIe) {\r
+                                               this.spanInUnwrappedPre = null;\r
+                                               this.spanInWrappedDiv = null;\r
+                                       } else {\r
+                                               this.spanInMainDiv = null;\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       var currentSearch = null;\r
+                       var currentMatchIndex = null;\r
+\r
+                       function doSearch() {\r
+                               var searchBox = $("searchBox");\r
+                               var searchTerm = searchBox.value;\r
+                               var isRegex = $("searchRegex").checked;\r
+                               var isCaseSensitive = $("searchCaseSensitive").checked;\r
+                               var i;\r
+\r
+                               if (searchTerm === "") {\r
+                                       $("searchReset").disabled = true;\r
+                                       $("searchNav").style.display = "none";\r
+                                       removeClass(document.body, "searching");\r
+                                       removeClass(searchBox, "hasmatches");\r
+                                       removeClass(searchBox, "nomatches");\r
+                                       for (i = 0; i < logEntries.length; i++) {\r
+                                               logEntries[i].clearSearch();\r
+                                               logEntries[i].setContent(logEntries[i].formattedMessage, logEntries[i].formattedMessage);\r
+                                       }\r
+                                       currentSearch = null;\r
+                                       setLogContainerHeight();\r
+                               } else {\r
+                                       $("searchReset").disabled = false;\r
+                                       $("searchNav").style.display = "block";\r
+                                       var searchRegex;\r
+                                       var regexValid;\r
+                                       if (isRegex) {\r
+                                               try {\r
+                                                       searchRegex = isCaseSensitive ? new RegExp(searchTerm, "g") : new RegExp(searchTerm, "gi");\r
+                                                       regexValid = true;\r
+                                                       replaceClass(searchBox, "validregex", "invalidregex");\r
+                                                       searchBox.title = "Valid regex";\r
+                                               } catch (ex) {\r
+                                                       regexValid = false;\r
+                                                       replaceClass(searchBox, "invalidregex", "validregex");\r
+                                                       searchBox.title = "Invalid regex: " + (ex.message ? ex.message : (ex.description ? ex.description : "unknown error"));\r
+                                                       return;\r
+                                               }\r
+                                       } else {\r
+                                               searchBox.title = "";\r
+                                               removeClass(searchBox, "validregex");\r
+                                               removeClass(searchBox, "invalidregex");\r
+                                       }\r
+                                       addClass(document.body, "searching");\r
+                                       currentSearch = new Search(searchTerm, isRegex, searchRegex, isCaseSensitive);\r
+                                       for (i = 0; i < logEntries.length; i++) {\r
+                                               currentSearch.applyTo(logEntries[i]);\r
+                                       }\r
+                                       setLogContainerHeight();\r
+\r
+                                       // Highlight the first search match\r
+                                       if (currentSearch.hasVisibleMatches()) {\r
+                                               setCurrentMatchIndex(0);\r
+                                               displayMatches();\r
+                                       } else {\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function updateSearchFromFilters() {\r
+                               if (currentSearch) {\r
+                                       if (currentSearch.hasMatches()) {\r
+                                               if (currentMatchIndex === null) {\r
+                                                       currentMatchIndex = 0;\r
+                                               }\r
+                                               var currentMatch = currentSearch.matches[currentMatchIndex];\r
+                                               if (currentMatch.isVisible()) {\r
+                                                       displayMatches();\r
+                                                       setCurrentMatchIndex(currentMatchIndex);\r
+                                               } else {\r
+                                                       currentMatch.setNotCurrent();\r
+                                                       // Find the next visible match, if one exists\r
+                                                       var nextVisibleMatchIndex = currentSearch.getNextVisibleMatchIndex();\r
+                                                       if (nextVisibleMatchIndex > -1) {\r
+                                                               setCurrentMatchIndex(nextVisibleMatchIndex);\r
+                                                               displayMatches();\r
+                                                       } else {\r
+                                                               displayNoMatches();\r
+                                                       }\r
+                                               }\r
+                                       } else {\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function refreshCurrentMatch() {\r
+                               if (currentSearch && currentSearch.hasVisibleMatches()) {\r
+                                       setCurrentMatchIndex(currentMatchIndex);\r
+                               }\r
+                       }\r
+\r
+                       function displayMatches() {\r
+                               replaceClass($("searchBox"), "hasmatches", "nomatches");\r
+                               $("searchBox").title = "" + currentSearch.matches.length + " matches found";\r
+                               $("searchNav").style.display = "block";\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function displayNoMatches() {\r
+                               replaceClass($("searchBox"), "nomatches", "hasmatches");\r
+                               $("searchBox").title = "No matches found";\r
+                               $("searchNav").style.display = "none";\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function toggleSearchEnabled(enable) {\r
+                               enable = (typeof enable == "undefined") ? !$("searchDisable").checked : enable;\r
+                               $("searchBox").disabled = !enable;\r
+                               $("searchReset").disabled = !enable;\r
+                               $("searchRegex").disabled = !enable;\r
+                               $("searchNext").disabled = !enable;\r
+                               $("searchPrevious").disabled = !enable;\r
+                               $("searchCaseSensitive").disabled = !enable;\r
+                               $("searchNav").style.display = (enable && ($("searchBox").value !== "") &&\r
+                                               currentSearch && currentSearch.hasVisibleMatches()) ?\r
+                                       "block" : "none";\r
+                               if (enable) {\r
+                                       removeClass($("search"), "greyedout");\r
+                                       addClass(document.body, "searching");\r
+                                       if ($("searchHighlight").checked) {\r
+                                               addClass(logMainContainer, "searchhighlight");\r
+                                       } else {\r
+                                               removeClass(logMainContainer, "searchhighlight");\r
+                                       }\r
+                                       if ($("searchFilter").checked) {\r
+                                               addClass(logMainContainer, "searchfilter");\r
+                                       } else {\r
+                                               removeClass(logMainContainer, "searchfilter");\r
+                                       }\r
+                                       $("searchDisable").checked = !enable;\r
+                               } else {\r
+                                       addClass($("search"), "greyedout");\r
+                                       removeClass(document.body, "searching");\r
+                                       removeClass(logMainContainer, "searchhighlight");\r
+                                       removeClass(logMainContainer, "searchfilter");\r
+                               }\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function toggleSearchFilter() {\r
+                               var enable = $("searchFilter").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "searchfilter");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "searchfilter");\r
+                               }\r
+                               refreshCurrentMatch();\r
+                       }\r
+\r
+                       function toggleSearchHighlight() {\r
+                               var enable = $("searchHighlight").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "searchhighlight");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "searchhighlight");\r
+                               }\r
+                       }\r
+\r
+                       function clearSearch() {\r
+                               $("searchBox").value = "";\r
+                               doSearch();\r
+                       }\r
+\r
+                       function searchNext() {\r
+                               if (currentSearch !== null && currentMatchIndex !== null) {\r
+                                       currentSearch.matches[currentMatchIndex].setNotCurrent();\r
+                                       var nextMatchIndex = currentSearch.getNextVisibleMatchIndex();\r
+                                       if (nextMatchIndex > currentMatchIndex || confirm("Reached the end of the page. Start from the top?")) {\r
+                                               setCurrentMatchIndex(nextMatchIndex);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function searchPrevious() {\r
+                               if (currentSearch !== null && currentMatchIndex !== null) {\r
+                                       currentSearch.matches[currentMatchIndex].setNotCurrent();\r
+                                       var previousMatchIndex = currentSearch.getPreviousVisibleMatchIndex();\r
+                                       if (previousMatchIndex < currentMatchIndex || confirm("Reached the start of the page. Continue from the bottom?")) {\r
+                                               setCurrentMatchIndex(previousMatchIndex);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function setCurrentMatchIndex(index) {\r
+                               currentMatchIndex = index;\r
+                               currentSearch.matches[currentMatchIndex].setCurrent();\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------------- */\r
+\r
+                       // CSS Utilities\r
+\r
+                       function addClass(el, cssClass) {\r
+                               if (!hasClass(el, cssClass)) {\r
+                                       if (el.className) {\r
+                                               el.className += " " + cssClass;\r
+                                       } else {\r
+                                               el.className = cssClass;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function hasClass(el, cssClass) {\r
+                               if (el.className) {\r
+                                       var classNames = el.className.split(" ");\r
+                                       return array_contains(classNames, cssClass);\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function removeClass(el, cssClass) {\r
+                               if (hasClass(el, cssClass)) {\r
+                                       // Rebuild the className property\r
+                                       var existingClasses = el.className.split(" ");\r
+                                       var newClasses = [];\r
+                                       for (var i = 0, len = existingClasses.length; i < len; i++) {\r
+                                               if (existingClasses[i] != cssClass) {\r
+                                                       newClasses[newClasses.length] = existingClasses[i];\r
+                                               }\r
+                                       }\r
+                                       el.className = newClasses.join(" ");\r
+                               }\r
+                       }\r
+\r
+                       function replaceClass(el, newCssClass, oldCssClass) {\r
+                               removeClass(el, oldCssClass);\r
+                               addClass(el, newCssClass);\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------------- */\r
+\r
+                       // Other utility functions\r
+\r
+                       function getElementsByClass(el, cssClass, tagName) {\r
+                               var elements = el.getElementsByTagName(tagName);\r
+                               var matches = [];\r
+                               for (var i = 0, len = elements.length; i < len; i++) {\r
+                                       if (hasClass(elements[i], cssClass)) {\r
+                                               matches.push(elements[i]);\r
+                                       }\r
+                               }\r
+                               return matches;\r
+                       }\r
+\r
+                       // Syntax borrowed from Prototype library\r
+                       function $(id) {\r
+                               return document.getElementById(id);\r
+                       }\r
+\r
+                       function isDescendant(node, ancestorNode) {\r
+                               while (node != null) {\r
+                                       if (node === ancestorNode) {\r
+                                               return true;\r
+                                       }\r
+                                       node = node.parentNode;\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function isOrphan(node) {\r
+                               var currentNode = node;\r
+                               while (currentNode) {\r
+                                       if (currentNode == document.body) {\r
+                                               return false;\r
+                                       }\r
+                                       currentNode = currentNode.parentNode;\r
+                               }\r
+                               return true;\r
+                       }\r
+\r
+                       function escapeHtml(str) {\r
+                               return str.replace(/&/g, "&amp;").replace(/[<]/g, "&lt;").replace(/>/g, "&gt;");\r
+                       }\r
+\r
+                       function getWindowWidth() {\r
+                               if (window.innerWidth) {\r
+                                       return window.innerWidth;\r
+                               } else if (document.documentElement && document.documentElement.clientWidth) {\r
+                                       return document.documentElement.clientWidth;\r
+                               } else if (document.body) {\r
+                                       return document.body.clientWidth;\r
+                               }\r
+                               return 0;\r
+                       }\r
+\r
+                       function getWindowHeight() {\r
+                               if (window.innerHeight) {\r
+                                       return window.innerHeight;\r
+                               } else if (document.documentElement && document.documentElement.clientHeight) {\r
+                                       return document.documentElement.clientHeight;\r
+                               } else if (document.body) {\r
+                                       return document.body.clientHeight;\r
+                               }\r
+                               return 0;\r
+                       }\r
+\r
+                       function getToolBarsHeight() {\r
+                               return $("switches").offsetHeight;\r
+                       }\r
+\r
+                       function getChromeHeight() {\r
+                               var height = getToolBarsHeight();\r
+                               if (showCommandLine) {\r
+                                       height += $("commandLine").offsetHeight;\r
+                               }\r
+                               return height;\r
+                       }\r
+\r
+                       function setLogContainerHeight() {\r
+                               if (logMainContainer) {\r
+                                       var windowHeight = getWindowHeight();\r
+                                       $("body").style.height = getWindowHeight() + "px";\r
+                                       logMainContainer.style.height = "" +\r
+                                               Math.max(0, windowHeight - getChromeHeight()) + "px";\r
+                               }\r
+                       }\r
+\r
+                       function setCommandInputWidth() {\r
+                               if (showCommandLine) {\r
+                                       $("command").style.width = "" + Math.max(0, $("commandLineContainer").offsetWidth -\r
+                                               ($("evaluateButton").offsetWidth + 13)) + "px";\r
+                               }\r
+                       }\r
+\r
+                       window.onresize = function() {\r
+                               setCommandInputWidth();\r
+                               setLogContainerHeight();\r
+                       };\r
+\r
+                       if (!Array.prototype.push) {\r
+                               Array.prototype.push = function() {\r
+                               for (var i = 0, len = arguments.length; i < len; i++){\r
+                                   this[this.length] = arguments[i];\r
+                               }\r
+                               return this.length;\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.pop) {\r
+                               Array.prototype.pop = function() {\r
+                                       if (this.length > 0) {\r
+                                               var val = this[this.length - 1];\r
+                                               this.length = this.length - 1;\r
+                                               return val;\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.shift) {\r
+                               Array.prototype.shift = function() {\r
+                                       if (this.length > 0) {\r
+                                               var firstItem = this[0];\r
+                                               for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                                                       this[i] = this[i + 1];\r
+                                               }\r
+                                               this.length = this.length - 1;\r
+                                               return firstItem;\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.splice) {\r
+                               Array.prototype.splice = function(startIndex, deleteCount) {\r
+                                       var itemsAfterDeleted = this.slice(startIndex + deleteCount);\r
+                                       var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);\r
+                                       this.length = startIndex;\r
+                                       // Copy the arguments into a proper Array object\r
+                                       var argumentsArray = [];\r
+                                       for (var i = 0, len = arguments.length; i < len; i++) {\r
+                                               argumentsArray[i] = arguments[i];\r
+                                       }\r
+                                       var itemsToAppend = (argumentsArray.length > 2) ?\r
+                                               itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;\r
+                                       for (i = 0, len = itemsToAppend.length; i < len; i++) {\r
+                                               this.push(itemsToAppend[i]);\r
+                                       }\r
+                                       return itemsDeleted;\r
+                               };\r
+                       }\r
+\r
+                       function array_remove(arr, val) {\r
+                               var index = -1;\r
+                               for (var i = 0, len = arr.length; i < len; i++) {\r
+                                       if (arr[i] === val) {\r
+                                               index = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               if (index >= 0) {\r
+                                       arr.splice(index, 1);\r
+                                       return index;\r
+                               } else {\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       function array_removeFromStart(array, numberToRemove) {\r
+                               if (Array.prototype.splice) {\r
+                                       array.splice(0, numberToRemove);\r
+                               } else {\r
+                                       for (var i = numberToRemove, len = array.length; i < len; i++) {\r
+                                               array[i - numberToRemove] = array[i];\r
+                                       }\r
+                                       array.length = array.length - numberToRemove;\r
+                               }\r
+                               return array;\r
+                       }\r
+\r
+                       function array_contains(arr, val) {\r
+                               for (var i = 0, len = arr.length; i < len; i++) {\r
+                                       if (arr[i] == val) {\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function getErrorMessage(ex) {\r
+                               if (ex.message) {\r
+                                       return ex.message;\r
+                               } else if (ex.description) {\r
+                                       return ex.description;\r
+                               }\r
+                               return "" + ex;\r
+                       }\r
+\r
+                       function moveCaretToEnd(input) {\r
+                               if (input.setSelectionRange) {\r
+                                       input.focus();\r
+                                       var length = input.value.length;\r
+                                       input.setSelectionRange(length, length);\r
+                               } else if (input.createTextRange) {\r
+                                       var range = input.createTextRange();\r
+                                       range.collapse(false);\r
+                                       range.select();\r
+                               }\r
+                               input.focus();\r
+                       }\r
+\r
+                       function stopPropagation(evt) {\r
+                               if (evt.stopPropagation) {\r
+                                       evt.stopPropagation();\r
+                               } else if (typeof evt.cancelBubble != "undefined") {\r
+                                       evt.cancelBubble = true;\r
+                               }\r
+                       }\r
+\r
+                       function getEvent(evt) {\r
+                               return evt ? evt : event;\r
+                       }\r
+\r
+                       function getTarget(evt) {\r
+                               return evt.target ? evt.target : evt.srcElement;\r
+                       }\r
+\r
+                       function getRelatedTarget(evt) {\r
+                               if (evt.relatedTarget) {\r
+                                       return evt.relatedTarget;\r
+                               } else if (evt.srcElement) {\r
+                                       switch(evt.type) {\r
+                                               case "mouseover":\r
+                                                       return evt.fromElement;\r
+                                               case "mouseout":\r
+                                                       return evt.toElement;\r
+                                               default:\r
+                                                       return evt.srcElement;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function cancelKeyEvent(evt) {\r
+                               evt.returnValue = false;\r
+                               stopPropagation(evt);\r
+                       }\r
+\r
+                       function evalCommandLine() {\r
+                               var expr = $("command").value;\r
+                               evalCommand(expr);\r
+                               $("command").value = "";\r
+                       }\r
+\r
+                       function evalLastCommand() {\r
+                               if (lastCommand != null) {\r
+                                       evalCommand(lastCommand);\r
+                               }\r
+                       }\r
+\r
+                       var lastCommand = null;\r
+                       var commandHistory = [];\r
+                       var currentCommandIndex = 0;\r
+\r
+                       function evalCommand(expr) {\r
+                               if (appender) {\r
+                                       appender.evalCommandAndAppend(expr);\r
+                               } else {\r
+                                       var prefix = ">>> " + expr + "\r\n";\r
+                                       try {\r
+                                               log("INFO", prefix + eval(expr));\r
+                                       } catch (ex) {\r
+                                               log("ERROR", prefix + "Error: " + getErrorMessage(ex));\r
+                                       }\r
+                               }\r
+                               // Update command history\r
+                               if (expr != commandHistory[commandHistory.length - 1]) {\r
+                                       commandHistory.push(expr);\r
+                                       // Update the appender\r
+                                       if (appender) {\r
+                                               appender.storeCommandHistory(commandHistory);\r
+                                       }\r
+                               }\r
+                               currentCommandIndex = (expr == commandHistory[currentCommandIndex]) ? currentCommandIndex + 1 : commandHistory.length;\r
+                               lastCommand = expr;\r
+                       }\r
+                       //]]>\r
+               </script>\r
+               <style type="text/css">\r
+                       body {\r
+                               background-color: white;\r
+                               color: black;\r
+                               padding: 0;\r
+                               margin: 0;\r
+                               font-family: tahoma, verdana, arial, helvetica, sans-serif;\r
+                               overflow: hidden;\r
+                       }\r
+\r
+                       div#switchesContainer input {\r
+                               margin-bottom: 0;\r
+                       }\r
+\r
+                       div.toolbar {\r
+                               border-top: solid #ffffff 1px;\r
+                               border-bottom: solid #aca899 1px;\r
+                               background-color: #f1efe7;\r
+                               padding: 3px 5px;\r
+                               font-size: 68.75%;\r
+                       }\r
+\r
+                       div.toolbar, div#search input {\r
+                               font-family: tahoma, verdana, arial, helvetica, sans-serif;\r
+                       }\r
+\r
+                       div.toolbar input.button {\r
+                               padding: 0 5px;\r
+                               font-size: 100%;\r
+                       }\r
+\r
+                       div.toolbar input.hidden {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#switches input#clearButton {\r
+                               margin-left: 20px;\r
+                       }\r
+\r
+                       div#levels label {\r
+                               font-weight: bold;\r
+                       }\r
+\r
+                       div#levels label, div#options label {\r
+                               margin-right: 5px;\r
+                       }\r
+\r
+                       div#levels label#wrapLabel {\r
+                               font-weight: normal;\r
+                       }\r
+\r
+                       div#search label {\r
+                               margin-right: 10px;\r
+                       }\r
+\r
+                       div#search label.searchboxlabel {\r
+                               margin-right: 0;\r
+                       }\r
+\r
+                       div#search input {\r
+                               font-size: 100%;\r
+                       }\r
+\r
+                       div#search input.validregex {\r
+                               color: green;\r
+                       }\r
+\r
+                       div#search input.invalidregex {\r
+                               color: red;\r
+                       }\r
+\r
+                       div#search input.nomatches {\r
+                               color: white;\r
+                               background-color: #ff6666;\r
+                       }\r
+\r
+                       div#search input.nomatches {\r
+                               color: white;\r
+                               background-color: #ff6666;\r
+                       }\r
+\r
+                       div#searchNav {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#commandLine {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#commandLine input#command {\r
+                               font-size: 100%;\r
+                               font-family: Courier New, Courier;\r
+                       }\r
+\r
+                       div#commandLine input#evaluateButton {\r
+                       }\r
+\r
+                       *.greyedout {\r
+                               color: gray !important;\r
+                               border-color: gray !important;\r
+                       }\r
+\r
+                       *.greyedout *.alwaysenabled { color: black; }\r
+\r
+                       *.unselectable {\r
+                               -khtml-user-select: none;\r
+                               -moz-user-select: none;\r
+                               user-select: none;\r
+                       }\r
+\r
+                       div#log {\r
+                               font-family: Courier New, Courier;\r
+                               font-size: 75%;\r
+                               width: 100%;\r
+                               overflow: auto;\r
+                               clear: both;\r
+                               position: relative;\r
+                       }\r
+\r
+                       div.group {\r
+                               border-color: #cccccc;\r
+                               border-style: solid;\r
+                               border-width: 1px 0 1px 1px;\r
+                               overflow: visible;\r
+                       }\r
+\r
+                       div.oldIe div.group, div.oldIe div.group *, div.oldIe *.logentry {\r
+                               height: 1%;\r
+                       }\r
+\r
+                       div.group div.groupheading span.expander {\r
+                               border: solid black 1px;\r
+                               font-family: Courier New, Courier;\r
+                               font-size: 0.833em;\r
+                               background-color: #eeeeee;\r
+                               position: relative;\r
+                               top: -1px;\r
+                               color: black;\r
+                               padding: 0 2px;\r
+                               cursor: pointer;\r
+                               cursor: hand;\r
+                               height: 1%;\r
+                       }\r
+\r
+                       div.group div.groupcontent {\r
+                               margin-left: 10px;\r
+                               padding-bottom: 2px;\r
+                               overflow: visible;\r
+                       }\r
+\r
+                       div.group div.expanded {\r
+                               display: block;\r
+                       }\r
+\r
+                       div.group div.collapsed {\r
+                               display: none;\r
+                       }\r
+\r
+                       *.logentry {\r
+                               overflow: visible;\r
+                               display: none;\r
+                               white-space: pre;\r
+                       }\r
+\r
+                       span.pre {\r
+                               white-space: pre;\r
+                       }\r
+                       \r
+                       pre.unwrapped {\r
+                               display: inline !important;\r
+                       }\r
+\r
+                       pre.unwrapped pre.pre, div.wrapped pre.pre {\r
+                               display: inline;\r
+                       }\r
+\r
+                       div.wrapped pre.pre {\r
+                               white-space: normal;\r
+                       }\r
+\r
+                       div.wrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       body.searching *.logentry span.currentmatch {\r
+                               color: white !important;\r
+                               background-color: green !important;\r
+                       }\r
+\r
+                       body.searching div.searchhighlight *.logentry span.searchterm {\r
+                               color: black;\r
+                               background-color: yellow;\r
+                       }\r
+\r
+                       div.wrap *.logentry {\r
+                               white-space: normal !important;\r
+                               border-width: 0 0 1px 0;\r
+                               border-color: #dddddd;\r
+                               border-style: dotted;\r
+                       }\r
+\r
+                       div.wrap #log_wrapped, #log_unwrapped {\r
+                               display: block;\r
+                       }\r
+\r
+                       div.wrap #log_unwrapped, #log_wrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       div.wrap *.logentry span.pre {\r
+                               overflow: visible;\r
+                               white-space: normal;\r
+                       }\r
+\r
+                       div.wrap *.logentry pre.unwrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       div.wrap *.logentry span.wrapped {\r
+                               display: inline;\r
+                       }\r
+\r
+                       div.searchfilter *.searchnonmatch {\r
+                               display: none !important;\r
+                       }\r
+\r
+                       div#log *.TRACE, label#label_TRACE {\r
+                               color: #666666;\r
+                       }\r
+\r
+                       div#log *.DEBUG, label#label_DEBUG {\r
+                               color: green;\r
+                       }\r
+\r
+                       div#log *.INFO, label#label_INFO {\r
+                               color: #000099;\r
+                       }\r
+\r
+                       div#log *.WARN, label#label_WARN {\r
+                               color: #999900;\r
+                       }\r
+\r
+                       div#log *.ERROR, label#label_ERROR {\r
+                               color: red;\r
+                       }\r
+\r
+                       div#log *.FATAL, label#label_FATAL {\r
+                               color: #660066;\r
+                       }\r
+\r
+                       div.TRACE#log *.TRACE,\r
+                       div.DEBUG#log *.DEBUG,\r
+                       div.INFO#log *.INFO,\r
+                       div.WARN#log *.WARN,\r
+                       div.ERROR#log *.ERROR,\r
+                       div.FATAL#log *.FATAL {\r
+                               display: block;\r
+                       }\r
+\r
+                       div#log div.separator {\r
+                               background-color: #cccccc;\r
+                               margin: 5px 0;\r
+                               line-height: 1px;\r
+                       }\r
+               </style>\r
+       </head>\r
+\r
+       <body id="body">\r
+               <div id="switchesContainer">\r
+                       <div id="switches">\r
+                               <div id="levels" class="toolbar">\r
+                                       Filters:\r
+                                       <input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>\r
+                                       <input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>\r
+                                       <input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>\r
+                                       <input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>\r
+                                       <input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>\r
+                                       <input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>\r
+                                       <input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>\r
+                               </div>\r
+                               <div id="search" class="toolbar">\r
+                                       <label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />\r
+                                       <input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />\r
+                                       <input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>\r
+                                       <input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>\r
+                                       <input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>\r
+                                       <div id="searchNav">\r
+                                               <input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />\r
+                                               <input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />\r
+                                               <input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>\r
+                                               <input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>\r
+                                       </div>\r
+                               </div>\r
+                               <div id="options" class="toolbar">\r
+                                       Options:\r
+                                       <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>\r
+                                       <input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>\r
+                                       <input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>\r
+                                       <input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>\r
+                                       <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />\r
+                                       <input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />\r
+                                       <input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />\r
+                               </div>\r
+                       </div>\r
+               </div>\r
+               <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+               <div id="commandLine" class="toolbar">\r
+                       <div id="commandLineContainer">\r
+                               <input type="text" id="command" title="Enter a JavaScript command here and hit return or press 'Evaluate'" />\r
+                               <input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />\r
+                       </div>\r
+               </div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/demos/basic.html b/planetstack/core/static/log4javascript-1.4.6/demos/basic.html
new file mode 100644 (file)
index 0000000..51d5857
--- /dev/null
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript basic demo</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+               <script type="text/javascript" src="../js/log4javascript.js"></script>\r
+               <script type="text/javascript">\r
+                       // <![CDATA[\r
+                       var log = log4javascript.getLogger("main");\r
+                       var appender = new log4javascript.PopUpAppender();\r
+                       log.addAppender(appender);\r
+                       log.debug("This is debugging message from the log4javascript basic demo page");\r
+\r
+                       var words = ["Watford", "eased", "their", "relegation", "fears", "with", "a", "win",\r
+                               "against", "a", "Charlton", "side", "who", "slipped", "further", "towards", "the",\r
+                               "drop", "Don", "Cowie", "drilled", "in", "a", "shot", "to", "put", "the", "Hornets",\r
+                               "ahead", "before", "Tresor", "Kandol", "ended", "a", "powerful", "run", "by",\r
+                               "rounding", "keeper", "Scott", "Loach", "and", "slotting", "in", "to", "level"\r
+                       ];\r
+\r
+                       var loaded = false;\r
+\r
+                       function generateRandom() {\r
+                               var numberOfEntries = parseInt(document.getElementById("numberOfLogEntries").value);\r
+                               for (var i = 0; i < numberOfEntries; i++) {\r
+                                       var numberOfWords = 1 + Math.floor(10 * Math.random());\r
+                                       var entryWords = [];\r
+                                       for (var j = 0; j < numberOfWords; j++) {\r
+                                               entryWords.push(words[Math.floor(Math.random() * words.length)]);\r
+                                       }\r
+                                       var entryMessage = entryWords.join(" ");\r
+                                       var levelNum = Math.floor(Math.random() * 6);\r
+                                       switch (levelNum) {\r
+                                               case 0:\r
+                                                       log.trace(entryMessage);\r
+                                                       break;\r
+                                               case 1:\r
+                                                       log.debug(entryMessage);\r
+                                                       break;\r
+                                               case 2:\r
+                                                       log.info(entryMessage);\r
+                                                       break;\r
+                                               case 3:\r
+                                                       log.warn(entryMessage);\r
+                                                       break;\r
+                                               case 4:\r
+                                                       log.error(entryMessage);\r
+                                                       break;\r
+                                               case 5:\r
+                                                       log.fatal(entryMessage);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function generateObjectExpansion() {\r
+                               var debugObj = {\r
+                                       a: {\r
+                                               b: "stuff",\r
+                                               c: 3,\r
+                                               d: {\r
+                                                       e: ["a", "b", "c"]\r
+                                               }\r
+                                       },\r
+                                       f: "Things",\r
+                                       g: 5\r
+                               };\r
+                               log.debug(debugObj);\r
+                       }\r
+\r
+                       function generateError() {\r
+                               try {\r
+                                       throw new Error("Made up error");\r
+                               } catch (ex) {\r
+                                       log.error("Logging an error!", ex);\r
+                               }\r
+                       }\r
+                       // ]]>\r
+               </script>\r
+       </head>\r
+       <body onload="loaded = true; document.getElementById('enabled').checked = true;">\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="/docs/index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="../docs/index.html">docs</a>\r
+                                       | <a class="navitem" href="../docs/quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript basic demo</h1>\r
+                               <p>\r
+                                       <em><strong>NB.</strong> Since the demo below uses pop-up windows, you will\r
+                                       need to disable any pop-up blockers you may have for it to work.</em>\r
+                               </p>\r
+                               <p>\r
+                                       This demo demonstrates the default logger. For more options, please see the\r
+                                       <a href="index.html">demos area</a>.\r
+                               </p>\r
+                               <p>\r
+                                       Enter a log message below and click on one of the buttons to log\r
+                                       your message at your desired level. You can then filter by\r
+                                       log level, toggle word-wrapping and perform text and regular\r
+                                       expression searches on the log entries.\r
+                               </p>\r
+                               <div class="example">\r
+                                       <input type="text" id="logText" value="Put log message here" />\r
+                                       <input type="button" value="debug" onclick="log.debug(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="info" onclick="log.info(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="warn" onclick="log.warn(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="error" onclick="log.error(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="fatal" onclick="log.fatal(document.getElementById('logText').value)" />\r
+                                       <br />\r
+                                       <input type="button" value="assert 1 equals 1" onclick="log.assert(1 === 1)" />\r
+                                       <input type="button" value="assert 1 equals 2" onclick="log.assert(1 === 2)" />\r
+                                       <br />\r
+                                       Generate <input type="text" size="5" id="numberOfLogEntries" value="50" /> random log entries\r
+                                       <input type="button" value="go" onclick="generateRandom()" />\r
+                                       <br />\r
+                                       <input type="button" value="Log exception" onclick="generateError()" />\r
+                                       <input type="button" value="Log example object" onclick="generateObjectExpansion()" />\r
+                                       <br />\r
+                                       <input type="checkbox" id="enabled" onclick="log4javascript.setEnabled(this.checked)" checked="checked" /> <label for="enabled">logging enabled</label>\r
+                                       <br />\r
+                                       <input type="text" id="groupName" value="Group name" />\r
+                                       <input type="button" value="group" onclick="log.group(document.getElementById('groupName').value)" />\r
+                                       <input type="button" value="end group" onclick="log.groupEnd()" />\r
+                                       <br />\r
+                                       <input type="text" id="timerName" value="Example timer name" />\r
+                                       <input type="button" value="start timer" onclick="log.time(document.getElementById('timerName').value)" />\r
+                                       <input type="button" value="end timer" onclick="log.timeEnd(document.getElementById('timerName').value)" />\r
+                               </div>\r
+                       </div>\r
+                       <br class="clear" />\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/demos/blank.html b/planetstack/core/static/log4javascript-1.4.6/demos/blank.html
new file mode 100644 (file)
index 0000000..7e8ac56
--- /dev/null
@@ -0,0 +1,4 @@
+<html>\r
+<head><title>Blank page</title></head>\r
+<body></body>\r
+</html>
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/demos/index.html b/planetstack/core/static/log4javascript-1.4.6/demos/index.html
new file mode 100644 (file)
index 0000000..00e84ac
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript demos</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="/docs/index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="../docs/index.html">docs</a>\r
+                                       | <a class="navitem" href="../docs/quickstart.html">quick start</a>\r
+                                       | <span class="navitem">demos</span>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript demos</h1>\r
+                               <ul>\r
+                                       <li><a href="basic.html">Basic demo</a></li>\r
+                                       <li><a href="inpage.html">In-page console demo</a></li>\r
+                                       <li><a href="lite.html">log4javascript Lite demo</a></li>\r
+                               </ul>\r
+                       </div>\r
+                       <br class="clear" />\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/demos/inpage.html b/planetstack/core/static/log4javascript-1.4.6/demos/inpage.html
new file mode 100644 (file)
index 0000000..8e47d72
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript in-page console demo</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+               <script type="text/javascript" src="../js/log4javascript_uncompressed.js"></script>\r
+               <script type="text/javascript">\r
+                       // <![CDATA[\r
+                       var log = log4javascript.getLogger("main");\r
+                       var appender = new log4javascript.InPageAppender();\r
+                       log.addAppender(appender);\r
+                       log.debug("This is a debugging message from the log4javascript in-page page");\r
+\r
+                       var words = ["Watford", "eased", "their", "relegation", "fears", "with", "a", "win",\r
+                               "against", "a", "Charlton", "side", "who", "slipped", "further", "towards", "the",\r
+                               "drop", "Don", "Cowie", "drilled", "in", "a", "shot", "to", "put", "the", "Hornets",\r
+                               "ahead", "before", "Tresor", "Kandol", "ended", "a", "powerful", "run", "by",\r
+                               "rounding", "keeper", "Scott", "Loach", "and", "slotting", "in", "to", "level"\r
+                       ];\r
+\r
+                       var loaded = false;\r
+\r
+                       function generateRandom() {\r
+                               var numberOfEntries = parseInt(document.getElementById("numberOfLogEntries").value);\r
+                               for (var i = 0; i < numberOfEntries; i++) {\r
+                                       var numberOfWords = 1 + Math.floor(10 * Math.random());\r
+                                       var entryWords = [];\r
+                                       for (var j = 0; j < numberOfWords; j++) {\r
+                                               entryWords.push(words[Math.floor(Math.random() * words.length)]);\r
+                                       }\r
+                                       var entryMessage = entryWords.join(" ");\r
+                                       var levelNum = Math.floor(Math.random() * 6);\r
+                                       switch (levelNum) {\r
+                                               case 0:\r
+                                                       log.trace(entryMessage);\r
+                                                       break;\r
+                                               case 1:\r
+                                                       log.debug(entryMessage);\r
+                                                       break;\r
+                                               case 2:\r
+                                                       log.info(entryMessage);\r
+                                                       break;\r
+                                               case 3:\r
+                                                       log.warn(entryMessage);\r
+                                                       break;\r
+                                               case 4:\r
+                                                       log.error(entryMessage);\r
+                                                       break;\r
+                                               case 5:\r
+                                                       log.fatal(entryMessage);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       var consoleVisible = true;\r
+                       \r
+                       function toggleConsole(button) {\r
+                               if (consoleVisible) {\r
+                                       appender.hide();\r
+                                       button.value = "Show console";\r
+                                       consoleVisible = false;\r
+                               } else {\r
+                                       appender.show();\r
+                                       button.value = "Hide console";\r
+                                       consoleVisible = true;\r
+                               }\r
+                       }\r
+\r
+                       function generateObjectExpansion() {\r
+                               var debugObj = {\r
+                                       a: {\r
+                                               b: "stuff",\r
+                                               c: 3,\r
+                                               d: {\r
+                                                       e: ["a", "b", "c"]\r
+                                               }\r
+                                       },\r
+                                       f: "Things",\r
+                                       g: 5\r
+                               };\r
+                               log.debug(debugObj);\r
+                       }\r
+\r
+                       function generateError() {\r
+                               try {\r
+                                       throw new Error("Made up error");\r
+                               } catch (ex) {\r
+                                       log.error("Logging an error!", ex);\r
+                               }\r
+                       }\r
+                       // ]]>\r
+               </script>\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="/docs/index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="../docs/index.html">docs</a>\r
+                                       | <a class="navitem" href="../docs/quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript in-page console demo</h1>\r
+                               <p>\r
+                                       This demo demonstrates an in-page logger. The example uses the default behaviour, which\r
+                                       is to place the log console in a fixed area at the bottom of the page. However, the\r
+                                       console may be placed inside any element in the page. To do this, you may specify the ID\r
+                                       of the element (even if the page has not yet loaded) or a reference to the element itself.\r
+                               </p>\r
+                               <p>\r
+                                       Enter a log message below and click on one of the buttons to log\r
+                                       your message at your desired level. You can then filter by\r
+                                       log level, toggle word-wrapping and perform text and regular\r
+                                       expression searches on the log entries.\r
+                               </p>\r
+                               <div class="example">\r
+                                       <input type="button" value="Hide console" onclick="toggleConsole(this)" />\r
+                                       <br />\r
+                                       <input type="text" id="logText" value="Put log message here" />\r
+                                       <input type="button" value="debug" onclick="log.debug(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="info" onclick="log.info(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="warn" onclick="log.warn(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="error" onclick="log.error(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="fatal" onclick="log.fatal(document.getElementById('logText').value)" />\r
+                                       <br />\r
+                                       <input type="button" value="assert 1 equals 1" onclick="log.assert(1 === 1)" />\r
+                                       <input type="button" value="assert 1 equals 2" onclick="log.assert(1 === 2)" />\r
+                                       <br />\r
+                                       Generate <input type="text" size="5" id="numberOfLogEntries" value="50" /> random log entries\r
+                                       <input type="button" value="go" onclick="generateRandom()" />\r
+                                       <br />\r
+                                       <input type="button" value="Log exception" onclick="generateError()" />\r
+                                       <input type="button" value="Log example object" onclick="generateObjectExpansion()" />\r
+                                       <br />\r
+                                       <input type="checkbox" id="enabled" onclick="log4javascript.setEnabled(this.checked)" checked="checked" /> <label for="enabled">logging enabled</label>\r
+                                       <br />\r
+                                       <input type="text" id="groupName" value="Group name" />\r
+                                       <input type="button" value="group" onclick="log.group(document.getElementById('groupName').value)" />\r
+                                       <input type="button" value="end group" onclick="log.groupEnd()" />\r
+                                       <br />\r
+                                       <input type="text" id="timerName" value="Example timer name" />\r
+                                       <input type="button" value="start timer" onclick="log.time(document.getElementById('timerName').value)" />\r
+                                       <input type="button" value="end timer" onclick="log.timeEnd(document.getElementById('timerName').value)" />\r
+                               </div>\r
+                       </div>\r
+                       <br class="clear" />\r
+                       <div id="log"></div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/demos/lite.html b/planetstack/core/static/log4javascript-1.4.6/demos/lite.html
new file mode 100644 (file)
index 0000000..a1d2dd3
--- /dev/null
@@ -0,0 +1,148 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript lite demo</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+               <script type="text/javascript" src="../js/log4javascript_lite.js"></script>\r
+               <script type="text/javascript">\r
+                       // <![CDATA[\r
+                       var     log = log4javascript.getDefaultLogger();\r
+                       log.debug("This is debugging message from the log4javascript lite demo page");\r
+\r
+                       var words = ["Boothroyd", "who", "took", "over", "two", "years",\r
+                                       "ago", "and", "continues", "to", "maintain", "that", "the",\r
+                                       "club", "are", "building", "for", "the", "future", "made",\r
+                                       "six", "changes", "and", "gave", "a", "first", "Premiership",\r
+                                       "start", "to", "on-loan", "Brazilian", "midfielder",\r
+                                       "Douglas", "Rinaldi", "Darius", "Henderson", "and", "Steve",\r
+                                       "Kabba", "were", "two", "of", "the", "players", "restored",\r
+                                       "to", "the", "home", "side", "and", "were", "responsible",\r
+                                       "for", "giving", "Chelsea", "an", "uncomfortable", "start",\r
+                                       "which", "set", "the", "pattern", "for", "the", "match"\r
+                                       ];\r
+\r
+                       var loaded = false;\r
+\r
+                       function generateRandom() {\r
+                               var numberOfEntries = parseInt(document.getElementById("numberOfLogEntries").value);\r
+                               for (var i = 0; i < numberOfEntries; i++) {\r
+                                       var numberOfWords = 1 + Math.floor(10 * Math.random());\r
+                                       var entryWords = [];\r
+                                       for (var j = 0; j < numberOfWords; j++) {\r
+                                               entryWords.push(words[Math.floor(Math.random() * words.length)]);\r
+                                       }\r
+                                       var entryMessage = entryWords.join(" ");\r
+                                       var levelNum = Math.floor(Math.random() * 6);\r
+                                       switch (levelNum) {\r
+                                               case 0:\r
+                                                       log.trace(entryMessage);\r
+                                                       break;\r
+                                               case 1:\r
+                                                       log.debug(entryMessage);\r
+                                                       break;\r
+                                               case 2:\r
+                                                       log.info(entryMessage);\r
+                                                       break;\r
+                                               case 3:\r
+                                                       log.warn(entryMessage);\r
+                                                       break;\r
+                                               case 4:\r
+                                                       log.error(entryMessage);\r
+                                                       break;\r
+                                               case 5:\r
+                                                       log.fatal(entryMessage);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function generateObjectExpansion() {\r
+                               var debugObj = {\r
+                                       a: {\r
+                                               b: "stuff",\r
+                                               c: 3,\r
+                                               d: {\r
+                                                       e: ["a", "b", "c"]\r
+                                               }\r
+                                       },\r
+                                       f: "Things",\r
+                                       g: 5\r
+                               };\r
+                               log.debug(debugObj);\r
+                       }\r
+\r
+                       function generateError() {\r
+                               try {\r
+                                       throw new Error("Made up error");\r
+                               } catch (ex) {\r
+                                       log.error("Logging an error!", ex);\r
+                               }\r
+                       }\r
+                       // ]]>\r
+               </script>\r
+       </head>\r
+       <body onload="loaded = true; document.getElementById('enabled').checked = true;">\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="/docs/index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="../docs/index.html">docs</a>\r
+                                       | <a class="navitem" href="../docs/quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../docs/manual.html">manual</a>\r
+                                       | <a class="navitem" href="index.html">demos</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk/log4javascript" target="_blank">website</a>\r
+                               </div>\r
+                               <h1>log4javascript lite demo</h1>\r
+                               <p>\r
+                                       <em><strong>NB.</strong> Since the demo below uses pop-up windows, you will\r
+                                       need to disable any pop-up blockers you may have for it to work.</em>\r
+                               </p>\r
+                               <p>\r
+                                       This demo demonstrates the lite edition of log4javascript.\r
+                               </p>\r
+                               <p>\r
+                                       Enter a log message below and click on one of the buttons to log\r
+                                       your message at your desired level.\r
+                               </p>\r
+                               <div class="example">\r
+                                       <input type="text" id="logText" value="Put log message here" />\r
+                                       <input type="button" value="trace" onclick="log.trace(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="debug" onclick="log.debug(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="info" onclick="log.info(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="warn" onclick="log.warn(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="error" onclick="log.error(document.getElementById('logText').value)" />\r
+                                       <input type="button" value="fatal" onclick="log.fatal(document.getElementById('logText').value)" />\r
+                                       <br />\r
+                                       Generate <input type="text" size="5" id="numberOfLogEntries" value="50" /> random log entries\r
+                                       <input type="button" value="go" onclick="generateRandom()" />\r
+                                       <br />\r
+                                       <input type="button" value="Log exception" onclick="generateError()" />\r
+                                       <input type="button" value="Log example object" onclick="generateObjectExpansion()" />\r
+                                       <br />\r
+                                       <input type="checkbox" id="enabled" onclick="log4javascript.setEnabled(this.checked)" checked="checked" /> <label for="enabled">logging enabled</label>\r
+                                       <br />\r
+                               </div>\r
+                       </div>\r
+                       <br class="clear" />\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/backwardsincompatibilities.html b/planetstack/core/static/log4javascript-1.4.6/docs/backwardsincompatibilities.html
new file mode 100644 (file)
index 0000000..f212fd4
--- /dev/null
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - backwards incompatibilities in version 1.4</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="/index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>Backwards incompatibilities in log4javascript 1.4</h1>\r
+                               <ul>\r
+                                       <li>\r
+                                               Loggers are now hierarchical. This means logger names containing full stops have\r
+                                               special meaning. For example, from version 1.4 the logger named <code>myapp.ajax</code>\r
+                                               by default inherits all the appenders of the logger named <code>myapp</code>, while\r
+                                               prior to version 1.4 these loggers would be entirely independent;\r
+                                       </li>\r
+                                       <li>\r
+                                               The signature of the <code>log</code> method of <code>Logger</code> has changed.\r
+                                               However, you should not use this method directly; instead, use one of the level-specific\r
+                                               wrapper functions (<code>debug</code>, <code>info</code>, <code>error</code> etc.);\r
+                                       </li>\r
+                                       <li>\r
+                                               Appenders can no longer be configured via constructor parameters. Instead you must use\r
+                                               setter methods;\r
+                                       </li>\r
+                                       <li>\r
+                                               The format of requests sent via <code><a href="manual.html#ajaxappender">AjaxAppender</a></code>\r
+                                               has changed when using <code><a href="manual.html#jsonlayout">JsonLayout</a></code> or\r
+                                               <code><a href="manual.html#xmllayout">XmlLayout</a></code>: the formatted log messages are sent\r
+                                               as a name-value pair (with default name <code>data</code>) rather than a single unencoded string;\r
+                                       </li>\r
+                                       <li>\r
+                                               All timestamps returned by <code><a href="manual.html#xmllayout">XmlLayout</a></code>,\r
+                                               <code><a href="manual.html#jsonlayout">JsonLayout</a></code> and\r
+                                               <code><a href="manual.html#httppostdatlayout">HttpPostDataLayout</a></code> are\r
+                                               now measured in milliseconds since January 1st 1970 (previously they were returned\r
+                                               as seconds since January 1st 1970);\r
+                                       </li>\r
+                                       <li>\r
+                                               The constructors for <a href="manual.html#jsonlayout">JsonLayout</a> and\r
+                                               <a href="manual.html#httppostdatlayout">HttpPostDataLayout</a> have changed; the property names\r
+                                               used for the properties of the logging event are now set via <code>setKeys</code> rather than\r
+                                               in the constructor;\r
+                                       </li>\r
+                                       <li>\r
+                                               <code>setReadable</code> has been removed from <a href="manual.html#jsonlayout">JsonLayout</a>.\r
+                                               The <code>readable</code> property should now be set via the constructor;\r
+                                       </li>\r
+                                       <li>\r
+                                               <code>addErrorListener</code> and <code>removeErrorListener</code> removed from\r
+                                               the <code>log4javascript</code> object and replaced with the more generic\r
+                                               <code><a href="manual.html#log4javascriptaddeventlistener">addEventListener</a></code>\r
+                                               and <code>removeEventListener</code> methods. The listener functions are passed\r
+                                               different parameters.\r
+                                       </li>\r
+                               </ul>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/distribution.html b/planetstack/core/static/log4javascript-1.4.6/docs/distribution.html
new file mode 100644 (file)
index 0000000..8f6cdfd
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" >\r
+       <head>\r
+               <title>log4javascript 1.4 distribution</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="../index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript 1.4 distribution</h1>\r
+                               <p>\r
+                                       From version 1.4 the distribution includes three different editions of log4javascript:\r
+                               </p>\r
+                               <ul>\r
+                                       <li>\r
+                                               <div><strong>Standard Edition</strong></div>\r
+                                               <p>\r
+                                                       Equivalent to log4javascript from earlier versions and suitable for general JavaScript\r
+                                                       debugging and logging (including via Ajax).\r
+                                               </p>\r
+                                       </li>\r
+                                       <li>\r
+                                               <div><strong>Production Edition</strong></div>\r
+                                               <p>\r
+                                                       Designed for use in production systems where the focus is solely on logging JavaScript\r
+                                                       messages back to the server. Consequently this edition omits all appenders except\r
+                                                       <a href="manual.html#ajaxappender">AjaxAppender</a>, resulting in a drastically reduced\r
+                                                       file size compared to the standard edition.\r
+                                               </p>\r
+                                       </li>\r
+                                       <li>\r
+                                               <div><strong>Lite Edition</strong></div>\r
+                                               <p>\r
+                                                       A lightweight version of log4javascript for quick page debugging. Included is a single logger\r
+                                                       using a basic pop-up window appender with a fixed layout.\r
+                                               </p>\r
+                                       </li>\r
+                               </ul>\r
+                               <p>\r
+                                       Each edition comes in compressed and uncompressed versions. The compressed version is\r
+                                       functionally identical to the uncompressed version but has had whitespace and comments removed\r
+                                       and therefore downloads more quickly.\r
+                               </p>\r
+                               <p>\r
+                                       Each edition also comes with a stub version. This contains dummy implementations of all\r
+                                       log4javacript objects and methods in the public API, making it ideal for production environments\r
+                                       where logging is not required. Replacing the main log4javascript script file with this file\r
+                                       means that log calls may be left in production code. Compressed and uncompressed versions of\r
+                                       each stub are included.\r
+                               </p>\r
+                               <p>\r
+                                       Finally, each edition comes with a suite of unit tests, available as HTML pages in the\r
+                                       <code>test/</code> directory. Note that these tests crash old versions (pre-3.1) of Safari. Sorry.\r
+                               </p>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/index.html b/planetstack/core/static/log4javascript-1.4.6/docs/index.html
new file mode 100644 (file)
index 0000000..d3b3ac2
--- /dev/null
@@ -0,0 +1,190 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript documentation</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="../index.html">log4javascript</a></h1>\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <span class="navitem">docs</span>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                       </div>\r
+                       <div id="content">\r
+                               <h1>log4javascript 1.4 documentation</h1>\r
+                               <div id="links">\r
+                                       <h2>Links</h2>\r
+                                       <ul>\r
+                                               <li><a href="quickstart.html">Quick start</a></li>\r
+                                               <li><a href="distribution.html">Details of the log4javascript distribution</a></li>\r
+                                               <li><a href="backwardsincompatibilities.html">Backwards incompatibilities</a></li>\r
+                                               <li><a href="whatsnew.html">What's new in this release</a></li>\r
+                                               <li><a href="../changelog.txt">Change log</a></li>\r
+                                               <li><a href="manual.html">log4javascript manual</a></li>\r
+                                               <li><a href="lite.html">log4javascript Lite</a></li>\r
+                                               <li><a href="manual_lite.html">log4javascript Lite manual</a></li>\r
+                                               <li><a href="../demos/basic.html">Basic demo</a></li>\r
+                                               <li><a href="../demos/ajax.html">Ajax demo</a></li>\r
+                                       </ul>\r
+                               </div>\r
+                               <div id="contents">\r
+                                       <h2>Contents</h2>\r
+                                       <ul>\r
+                                               <li><a href="#whatitis">What it is</a></li>\r
+                                               <li><a href="#whofor">Who it's for</a></li>\r
+                                               <li><a href="#previousversions">Note on previous versions</a></li>\r
+                                               <li><a href="#features">Features</a></li>\r
+                                               <li><a href="#browsers">Browser support</a></li>\r
+                                               <li><a href="#licence">Licence</a></li>\r
+                                               <li><a href="#furtherreading">Further reading</a></li>\r
+                                       </ul>\r
+                               </div>\r
+                               <div id="whatitis">\r
+                                       <h2>What it is</h2>\r
+                                       <p>\r
+                                               log4javascript is a JavaScript logging framework based on the Java\r
+                                               logging framework <a href="http://logging.apache.org/log4j/docs/index.html"\r
+                                               title="log4j home page (opens in new window)" target="_blank">log4j</a>.\r
+                                       </p>\r
+                                       <p>\r
+                                               log4javascript implements a subset of log4j (primarily loggers, appenders\r
+                                               and layouts) and has a few convenience methods of its own for\r
+                                               quick JavaScript development. It can be used to debug JavaScript\r
+                                               applications of all sizes, including Ajax applications.\r
+                                       </p>\r
+                                       <p>\r
+                                               If you just want to start using it, try the <a href="quickstart.html">quickstart\r
+                                               tutorial</a>.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="whofor">\r
+                                       <h2>Who it's for</h2>\r
+                                       <p>\r
+                                               log4javascript is aimed at JavaScript developers.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="previousversions">\r
+                                       <h2>Note on previous versions</h2>\r
+                                       <p>\r
+                                               Documentation for previous versions of log4javascript are not available here.\r
+                                               However, documentation is bundled with every previous version, all of which\r
+                                               are <a href="http://sourceforge.net/projects/log4javascript"\r
+                                                       target="_blank" title="Download (opens in new window)">available to download</a>.\r
+                                       </p>\r
+                               </div>\r
+                               <div id="features">\r
+                                       <h2>Features</h2>\r
+                                       <ul>\r
+                                               <li>can be initialized with one JavaScript include and one line of code;</li>\r
+                                               <li>\r
+                                                       by default logs to a pop-up console window with powerful search (including\r
+                                                       regular expression) and filtering features. This console window can also\r
+                                                       be used inline as an iframe in the main page;\r
+                                               </li>\r
+                                               <li>\r
+                                                       can send log messages to the server via HTTP (Ajax, if you like);\r
+                                               </li>\r
+                                               <li>\r
+                                                       highly configurable using familiar methods from log4j, including the\r
+                                                       powerful <code><a href="manual.html#patternlayout">PatternLayout</a></code>\r
+                                                       which gives the developer complete control over the format of the log messages.\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="browsers">\r
+                                       <h2>Browser support</h2>\r
+                                       <h3>Fully supported browsers:</h3>\r
+                                       <ul>\r
+                                               <li>All versions Firefox back to 0.6</li>\r
+                                               <li>Other Mozilla-based browsers, as far back as Netscape 7</li>\r
+                                               <li>Internet Explorer 5 and higher for Windows</li>\r
+                                               <li>Safari 1.3 and higher (untested on earlier versions)</li>\r
+                                               <li>Opera 8.01 and higher (pre- version 9 browsers have a rendering\r
+                                                       bug related to scrolling that affects searching in PopUpAppender and InPageAppender)</li>\r
+                                               <li>Konqueror 3.4.3 and higher (untested on earlier versions)</li>\r
+                                               <li>Google Chrome</li>\r
+                                       </ul>\r
+                                       <h3>Partially supported browsers:</h3>\r
+                                       <ul>\r
+                                               <li>Older Mozilla-based browsers, e.g. Netscape 6.2 (generally OK except for\r
+                                                       display problems searching and filtering PopUpAppender and InPageAppender)</li>\r
+                                               <li>Opera 7.0 - 8.0 (InPageAppender not supported until version 7.5, plus some display\r
+                                                       problems searching PopUpAppender and InPageAppender. AjaxAppender not supported at all)</li>\r
+                                       </ul>\r
+                                       <h3>Unsupported browsers:</h3>\r
+                                       <ul>\r
+                                               <li>\r
+                                                       Internet Explorer for Mac. There are no plans to make log4javascript work\r
+                                                       in this browser.\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="licence">\r
+                                       <h2>Licence</h2>\r
+                                       <p>\r
+                                               log4javascript is licenced under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                               Version 2.0</a>. The Apache website has <a href="http://www.apache.org/foundation/licence-FAQ.html#WhatDoesItMEAN"\r
+                                                       title="View licence (opens in new window)" target="_blank">more details</a>.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="furtherreading">\r
+                                       <h2>Further reading</h2>\r
+                                       <p>\r
+                                               In order to gain an understanding of the ideas behind log4j and therefore log4javascript,\r
+                                               I highly recommend reading the <a href="http://logging.apache.org/log4j/docs/manual.html">short\r
+                                               introduction to log4j</a> from the log4j website. log4javascript borrows heavily from\r
+                                               log4j but does not carry over all its concepts - for example, Filters and Renderers are not\r
+                                               implemented.\r
+                                       </p>\r
+                                       <p>\r
+                                               <a href="manual.html">The full log4javascript manual</a>\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/lite.html b/planetstack/core/static/log4javascript-1.4.6/docs/lite.html
new file mode 100644 (file)
index 0000000..11b4684
--- /dev/null
@@ -0,0 +1,182 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" >\r
+       <head>\r
+               <title>log4javascript 1.4 Lite</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+               <style type="text/css">\r
+                       .visibleifabletocopy {\r
+                               display: none;\r
+                       }\r
+                       \r
+                       body.abletocopy .visibleifabletocopy {\r
+                               display: block;\r
+                       }\r
+               </style>\r
+               <script type="text/javascript">\r
+                       function copyCode() {\r
+                               if (window.clipboardData && clipboardData.setData) {\r
+                                       clipboardData.setData("Text", code);\r
+                                       alert("Code copied to clipboard.")\r
+                               }\r
+                       }\r
+                       \r
+                       var code;\r
+                       \r
+                       window.onload = function() {\r
+                               var textArea = document.getElementById("codetextarea");\r
+                               code = textArea.value;\r
+                               textArea.select(); \r
+                               if (window.clipboardData && clipboardData.setData) {\r
+                                       document.body.className = "abletocopy";\r
+                               }\r
+                       };\r
+               </script>\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="lite.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="../index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript 1.4 Lite</h1>\r
+                               <h2>Contents</h2>\r
+                               <ul>\r
+                                       <li><a href="#intro">Introduction</a></li>\r
+                                       <li><a href="#code">Code</a></li>\r
+                                       <li><a href="#api">API</a></li>\r
+                               </ul>\r
+                               <div id="intro">\r
+                                       <h2>Introduction</h2>\r
+                                       <p>\r
+                                               log4javascript Lite is designed to be a basic, lightweight, cross-browser logging tool. It\r
+                                               provides functions to log messages of different severity to a pop-up window using the exactly\r
+                                               the same syntax as log4javascript.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="code">\r
+                                       <h2>Code</h2>\r
+                                       <p>\r
+                                               You can copy the code for log4javascript Lite below:\r
+                                       </p>\r
+                                       <textarea id="codetextarea" cols="80" rows="10">\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length--;return firstItem;}};}\r
+var log4javascript;(function(){var newLine="\r\n";function Log4JavaScript(){}\r
+log4javascript=new Log4JavaScript();log4javascript.version="1.4.6";log4javascript.edition="log4javascript_lite";function getExceptionMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}else{return String(ex);}}\r
+function getUrlFileName(url){var lastSlashIndex=Math.max(url.lastIndexOf("/"),url.lastIndexOf("\\"));return url.substr(lastSlashIndex+1);}\r
+function getExceptionStringRep(ex){if(ex){var exStr="Exception: "+getExceptionMessage(ex);try{if(ex.lineNumber){exStr+=" on line number "+ex.lineNumber;}\r
+if(ex.fileName){exStr+=" in file "+getUrlFileName(ex.fileName);}}catch(localEx){}\r
+if(showStackTraces&&ex.stack){exStr+=newLine+"Stack trace:"+newLine+ex.stack;}\r
+return exStr;}\r
+return null;}\r
+function isError(err){return(err instanceof Error);}\r
+function bool(obj){return Boolean(obj);}\r
+var enabled=(typeof log4javascript_disabled!="undefined")&&log4javascript_disabled?false:true;log4javascript.setEnabled=function(enable){enabled=bool(enable);};log4javascript.isEnabled=function(){return enabled;};var showStackTraces=false;log4javascript.setShowStackTraces=function(show){showStackTraces=bool(show);};var Level=function(level,name){this.level=level;this.name=name;};Level.prototype={toString:function(){return this.name;},equals:function(level){return this.level==level.level;},isGreaterOrEqual:function(level){return this.level>=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Appender(){var getConsoleHtmlLines=function(){return['<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">','<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">','<head>','<title>log4javascript</title>','<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />','<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->','<meta http-equiv="X-UA-Compatible" content="IE=7" />','<script type="text/javascript">','//<![CDATA[','var loggingEnabled=true;var messagesBeforeDocLoaded=[];function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}','function setLoggingEnabled(enable){loggingEnabled=enable;}','function scrollToLatestEntry(){var l=getLogContainer();if(typeof l.scrollTop!="undefined"){var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}','function log(logLevel,formattedMessage){if(loggingEnabled){if(loaded){doLog(logLevel,formattedMessage);}else{messagesBeforeDocLoaded.push([logLevel,formattedMessage]);}}}','function doLog(logLevel,formattedMessage){var logEntry=document.createElement("div");logEntry.appendChild(document.createTextNode(formattedMessage));logEntry.className="logentry "+logLevel.name;getLogContainer().appendChild(logEntry);scrollToLatestEntry();}','function mainPageReloaded(){var separator=document.createElement("div");separator.className="separator";separator.innerHTML="&nbsp;";getLogContainer().appendChild(separator);}','var loaded=false;var logLevels=["DEBUG","INFO","WARN","ERROR","FATAL"];window.onload=function(){setLogContainerHeight();toggleLoggingEnabled();for(var i=0;i<messagesBeforeDocLoaded.length;i++){doLog(messagesBeforeDocLoaded[i][0],messagesBeforeDocLoaded[i][1]);}','messagesBeforeDocLoaded=[];loaded=true;setTimeout(setLogContainerHeight,20);};function getLogContainer(){return $("log");}','function clearLog(){getLogContainer().innerHTML="";}','function $(id){return document.getElementById(id);}','function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}','return 0;}','function getChromeHeight(){return $("toolbar").offsetHeight;}','function setLogContainerHeight(){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";getLogContainer().style.height=""+','Math.max(0,windowHeight-getChromeHeight())+"px";}','window.onresize=function(){setLogContainerHeight();};','//]]>','</scr' + 'ipt>','<style type="text/css">','body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div#toolbar input.button{padding:0 5px;font-size:100%}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both}*.logentry{overflow:visible;white-space:pre}*.TRACE{color:#666666}*.DEBUG{color:green}*.INFO{color:#000099}*.WARN{color:#999900}*.ERROR{color:red}*.FATAL{color:#660066}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}','</style>','</head>','<body id="body">','<div id="toolbar">','Options:','<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" class="stateful" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Enable logging</label>','<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="stateful button" title="Clear all log messages"  />','<input type="button" id="closeButton" value="Close" onclick="window.close()" class="stateful button" title="Close the window" />','</div>','<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>','</body>','</html>'];};var popUp=null;var popUpsBlocked=false;var popUpClosed=false;var popUpLoaded=false;var complainAboutPopUpBlocking=true;var initialized=false;var isSupported=true;var width=600;var height=400;var focusPopUp=false;var queuedLoggingEvents=new Array();function isLoaded(win){try{return bool(win.loaded);}catch(ex){return false;}}\r
+function finalInit(){popUpLoaded=true;appendQueuedLoggingEvents();}\r
+function writeHtml(doc){var lines=getConsoleHtmlLines();doc.open();for(var i=0,len=lines.length;i<len;i++){doc.writeln(lines[i]);}\r
+doc.close();}\r
+function pollConsoleWindow(){function pollConsoleWindowLoaded(){if(popUpLoaded){clearInterval(poll);}else if(bool(popUp)&&isLoaded(popUp)){clearInterval(poll);finalInit();}}\r
+var poll=setInterval(pollConsoleWindowLoaded,100);}\r
+function init(){var windowProperties="width="+width+",height="+height+",status,resizable";var windowName="log4javascriptLitePopUp"+location.host.replace(/[^a-z0-9]/gi,"_");popUp=window.open("",windowName,windowProperties);popUpClosed=false;if(popUp){if(isLoaded(popUp)){popUp.mainPageReloaded();finalInit();}else{writeHtml(popUp.document);if(isLoaded(popUp)){finalInit();}else{pollConsoleWindow();}}}else{isSupported=false;if(complainAboutPopUpBlocking){alert("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");}}\r
+initialized=true;}\r
+function safeToAppend(){if(!popUpsBlocked&&!popUpClosed){if(popUp.closed){popUpClosed=true;return false;}\r
+if(!popUpLoaded&&popUp.loaded){popUpLoaded=true;}}\r
+return!popUpsBlocked&&popUpLoaded&&!popUpClosed;}\r
+function padWithZeroes(num,len){var str=""+num;while(str.length<len){str="0"+str;}\r
+return str;}\r
+function padWithSpaces(str,len){while(str.length<len){str+=" ";}\r
+return str;}\r
+this.append=function(loggingEvent){if(!initialized){init();}\r
+queuedLoggingEvents.push(loggingEvent);if(safeToAppend()){appendQueuedLoggingEvents();}};function appendQueuedLoggingEvents(){if(safeToAppend()){while(queuedLoggingEvents.length>0){var currentLoggingEvent=queuedLoggingEvents.shift();var date=currentLoggingEvent.timeStamp;var formattedDate=padWithZeroes(date.getHours(),2)+":"+\r
+padWithZeroes(date.getMinutes(),2)+":"+padWithZeroes(date.getSeconds(),2);var formattedMessage=formattedDate+" "+padWithSpaces(currentLoggingEvent.level.name,5)+" - "+currentLoggingEvent.getCombinedMessages();var throwableStringRep=currentLoggingEvent.getThrowableStrRep();if(throwableStringRep){formattedMessage+=newLine+throwableStringRep;}\r
+popUp.log(currentLoggingEvent.level,formattedMessage);}\r
+if(focusPopUp){popUp.focus();}}}}\r
+log4javascript.Appender=Appender;function Logger(){var appender=new Appender();var loggerLevel=Level.ALL;this.log=function(level,params){if(enabled&&level.isGreaterOrEqual(this.getLevel())){var exception;var finalParamIndex=params.length-1;var lastParam=params[params.length-1];if(params.length>1&&isError(lastParam)){exception=lastParam;finalParamIndex--;}\r
+var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];}\r
+var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);appender.append(loggingEvent);}};this.setLevel=function(level){loggerLevel=level;};this.getLevel=function(){return loggerLevel;};}\r
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=new Logger();}\r
+return defaultLogger;};log4javascript.getLogger=log4javascript.getDefaultLogger;var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger();nullLogger.setLevel(Level.OFF);}\r
+return nullLogger;};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length===1)?this.messages[0]:this.messages.join(newLine);}};log4javascript.LoggingEvent=LoggingEvent;window.log4javascript=log4javascript;})();\r
+</textarea>\r
+                                       <p class="visibleifabletocopy">\r
+                                               Press this button to copy the code to the clipboard:\r
+                                               <input type="button" value="Copy" onclick="copyCode()" />\r
+                                       </p>\r
+                                       <p>\r
+                                               You can either paste the above code inside a script tag:\r
+                                       </p>\r
+                                       <pre class="code">\r
+&lt;script type="text/javascript"&gt;\r
+       ... [Code here]...\r
+&lt;/script&gt;\r
+</pre>\r
+                                       <p>\r
+                                                ... or include the <code>log4javascript_lite.js</code> included in the distribution:\r
+                                       </p>\r
+                                       <pre class="code">\r
+&lt;script type="text/javascript" src="log4javascript_lite.js"&gt;&lt;/script&gt;\r
+</pre>\r
+                                       <pre class="code">\r
+&lt;script type="text/javascript"&gt;\r
+       var log = log4javascript.getDefaultLogger();\r
+&lt;/script&gt;\r
+</pre>\r
+                                       <p>\r
+                                               Using log4javascript Lite is identical to using log4javascript with its default logger:\r
+                                       </p>\r
+                                       <pre class="code">\r
+&lt;script type="text/javascript"&gt;\r
+       var log = log4javascript.getDefaultLogger();\r
+       log.debug("What's going on here then?");\r
+&lt;/script&gt;\r
+</pre>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="api">\r
+                                       <h2>API</h2>\r
+                                       <p>\r
+                                               The functions available in log4javascript Lite make up a small subset of those provided\r
+                                               by log4javascript proper. Each function is <strong>named and called identically to the equivalent\r
+                                               function in log4javascript</strong>. Full details can be found in the\r
+                                               <a href="manual_lite.html">log4javascript Lite manual</a>.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/manual.html b/planetstack/core/static/log4javascript-1.4.6/docs/manual.html
new file mode 100644 (file)
index 0000000..defac9c
--- /dev/null
@@ -0,0 +1,3198 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript 1.4 manual</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript 1.4 manual</h1>\r
+                               <h2>Contents</h2>\r
+                               <ul>\r
+                                       <li><a href="#intro">Introduction</a></li>\r
+                                       <li><a href="#noteaboutlog4javascript">Note about the log4javascript object</a></li>\r
+                                       <li>\r
+                                               <a href="#loggersappenderslayoutslevels">Loggers, appenders, layouts and levels</a>\r
+                                               <ul>\r
+                                                       <li><a href="#configuration">Configuring appenders</a></li>\r
+                                                       <li><a href="#loggersappenderslayoutslevelsexample">Example</a></li>\r
+                                               </ul>\r
+                                       </li>\r
+                                       <li><a href="#log4javascript">log4javascript static properties/methods</a></li>\r
+                                       <li><a href="#levels">Levels</a></li>\r
+                                       <li><a href="#loggers">Loggers</a></li>\r
+                                       <li>\r
+                                               <a href="#appenders">Appenders</a>\r
+                                               <ul>\r
+                                                       <li><a href="#appender">Appender</a></li>\r
+                                                       <li><a href="#alertappender">AlertAppender</a></li>\r
+                                                       <li><a href="#ajaxappender">AjaxAppender</a></li>\r
+                                                       <li><a href="#popupappender">PopUpAppender</a></li>\r
+                                                       <li><a href="#inpageappender">InPageAppender</a></li>\r
+                                                       <li><a href="#browserconsoleappender">BrowserConsoleAppender</a></li>\r
+                                               </ul>\r
+                                       </li>\r
+                                       <li>\r
+                                               <a href="#layouts">Layouts</a>\r
+                                               <ul>\r
+                                                       <li><a href="#layout">Layout</a></li>\r
+                                                       <li><a href="#nulllayout">NullLayout</a></li>\r
+                                                       <li><a href="#simplelayout">SimpleLayout</a></li>\r
+                                                       <li><a href="#patternlayout">PatternLayout</a></li>\r
+                                                       <li><a href="#xmllayout">XmlLayout</a></li>\r
+                                                       <li><a href="#jsonlayout">JsonLayout</a></li>\r
+                                                       <li><a href="#httppostdatalayout">HttpPostDataLayout</a></li>\r
+                                               </ul>\r
+                                       </li>\r
+                                       <li><a href="#enabling">Enabling / disabling log4javascript</a></li>\r
+                                       <li>\r
+                                               <a href="#errorhandling">log4javascript error handling</a>\r
+                                               <ul>\r
+                                                       <li><a href="#loglog">LogLog</a></li>\r
+                                               </ul>\r
+                                       </li>\r
+                                       <li><a href="#differences">Differences between log4javascript and log4j</a></li>\r
+                               </ul>\r
+                               <div id="intro">\r
+                                       <h2>Introduction</h2>\r
+                                       <p>\r
+                                               Anyone who has done a reasonable amount of JavaScript development will be\r
+                                               familiar with <code>alert</code> as a means of debugging. For\r
+                                               a small script, it works fine. But for anything of greater complexity than,\r
+                                               say, a rollover script its shortcomings become apparent. The most obvious problem\r
+                                               is the endless clicking of 'OK'. Another problem is that for a page\r
+                                               heavily reliant on events generated from user actions, alerts\r
+                                               can actually alter the way the page behaves. One final problem is infinite loops:\r
+                                               without alerts, the browser will notice that the script has messed\r
+                                               up and will offer the user the chance to stop the script running. With an\r
+                                               alert inside an infinite loop, you're forced to kill the browser.\r
+                                       </p>\r
+                                       <p>\r
+                                               At the other end of the scale there is\r
+                                               <a href="http://www.mozilla.org/projects/venkman/" target="_blank">Venkman</a>,\r
+                                               a full-on JavaScript debugger for Mozilla-based browsers such as Firefox. Here\r
+                                               I have to confess that I simply have not put in the time to learn how to make\r
+                                               it work well for me and I suspect I am not alone.\r
+                                       </p>\r
+                                       <p>\r
+                                               Nowadays, easily the best option for day-to-day JavaScript development is the brilliant\r
+                                               <a href="http://www.getfirebug.com" title="Firebug home page (opens in new window)"\r
+                                                  target="_blank">Firebug</a>, a Firefox plugin with built-in debugger, console, logging,\r
+                                               and profiler. It's a seriously impressive tool but by its very nature as a Firefox\r
+                                               plugin can only be used in one of the typical target browsers for mainstream web\r
+                                               development.\r
+                                       </p>\r
+                                       <p>\r
+                                               log4javascript was originally written as a cross-browser tool to ease the pain of JavaScript\r
+                                               debugging without the time investment required to use a debugger effectively. It requires\r
+                                               only a JavaScript include and one line of code to initialize with default settings.\r
+                                               Having for several years used log4j and its .NET port log4net, it was natural for me to\r
+                                               base it on log4j.\r
+                                       </p>\r
+                                       <p>\r
+                                               log4javascript is by no means the only JavaScript logging framework out there.\r
+                                               It is not even the only JavaScript implementation of log4j. It turns out the name\r
+                                               log4javascript is used by another JavaScript logging framework, and that the name log4js is\r
+                                               used by at least two other pieces of software; this version of log4javascript is unrelated\r
+                                               to any of those.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="noteaboutlog4javascript">\r
+                                       <h2>Note about the log4javascript object</h2>\r
+                                       <p>\r
+                                               All of log4javascript's instantiable classes are accessible via the log4javascript object, which\r
+                                               acts as a namespace. Therefore references to all class names must be preceded with "log4javascript.".\r
+                                               For example:\r
+                                       </p>\r
+                                       <p>\r
+                                               <code>var popUpAppender = new log4javascript.PopUpAppender();</code>\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="loggersappenderslayoutslevels">\r
+                                       <h2>Loggers, Appenders, Layouts and Levels</h2>\r
+                                       <p>\r
+                                               A <em>logger</em> in log4javascript is the object on which log calls are\r
+                                               made. A logger may be assigned zero or more <em>appenders</em>.\r
+                                               An appender is an object that actually does the logging: for example,\r
+                                               a <code><a href="#popupappender">PopUpAppender</a></code> logs messages to\r
+                                               a pop-up console window while an <code><a href="#ajaxappender">AjaxAppender</a></code>\r
+                                               uses HTTP to send log messages back to the server. Each appender is assigned\r
+                                               a <em>layout</em>, which is responsible for formatting log messages that\r
+                                               are passed to an appender.\r
+                                       </p>\r
+                                       <p>\r
+                                               Every log message has a <em>level</em>. This is the severity of the message.\r
+                                               Available levels are <code>TRACE</code>, <code>DEBUG</code>, <code>INFO</code>,\r
+                                               <code>WARN</code>, <code>ERROR</code> and <code>FATAL</code> - these correspond to\r
+                                               the logging methods <code>trace</code>, <code>debug</code>, <code>info</code>,\r
+                                               <code>warn</code>, <code>error</code> and <code>fatal</code> of <code>Logger</code>.\r
+                                               Levels are ordered as follows: <code>TRACE</code> &lt; <code>DEBUG</code> &lt;\r
+                                               <code>INFO</code> &lt; <code>WARN</code> &lt; <code>ERROR</code> &lt;\r
+                                               <code>FATAL</code>. This means the <code>FATAL</code> is the most severe and\r
+                                               <code>TRACE</code> the least. Also included are levels called <code>ALL</code>\r
+                                               and <code>OFF</code> intended to enable or disable all logging respectively.\r
+                                       </p>\r
+                                       <p>\r
+                                               Both loggers and appenders also have threshold levels (by default, <code>DEBUG</code>\r
+                                               for loggers and <code>ALL</code> for appenders).\r
+                                               Setting a level to either a logger or an appender disables log messages of severity\r
+                                               lower than that level. For instance, if a level of <code>INFO</code> is set on a\r
+                                               logger then only log messages of severity <code>INFO</code> or greater will be logged,\r
+                                               meaning <code>DEBUG</code> and <code>TRACE</code> messages will not be logged. If the\r
+                                               same logger had two appenders, one of level <code>DEBUG</code> and one of level\r
+                                               <code>WARN</code> then the first appender will still only log messages of\r
+                                               <code>INFO</code> or greater while the second appender will only log messages of level\r
+                                               <code>WARN</code> or greater.\r
+                                       </p>\r
+                                       <p>\r
+                                               This allows the developer fine control over which messages get logged where.\r
+                                       </p>\r
+                                       <div id="configuration">\r
+                                               <h3>Configuring appenders</h3>\r
+                                               <p>\r
+                                                       From version 1.4, <strong>configuring appenders is only possible via configuration\r
+                                                       methods</strong>. As the number of configuration options increases it becomes increasingly\r
+                                                       undesirable to use constructor parameters, so support for it has been dropped.\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="loggersappenderslayoutslevelsexample">\r
+                                               <h3>Example</h3>\r
+                                               <p>\r
+                                                       <strong>NB.</strong> The Ajax side of this example relies on having\r
+                                                       server-side processing in place.\r
+                                               </p>\r
+                                               <p>\r
+                                                       First, log4javascript is initialized, and a logger (actually the\r
+                                                       anonymous logger) is assigned to a variable called <code>log</code>:\r
+                                               </p>\r
+                                               <pre class="code">\r
+&lt;script type="text/javascript" src="log4javascript.js"&gt;&lt;/script&gt;\r
+&lt;script type="text/javascript"&gt;\r
+       //&lt;![CDATA[\r
+       var log = log4javascript.getLogger();\r
+</pre>\r
+                                               <p>\r
+                                                       <code>log</code> does not yet have any appenders, so a call to <code>log.debug()</code>\r
+                                                       will do nothing as yet. For this example we will use a\r
+                                                       <code><a href="#popupappender">PopUpAppender</a></code> for debugging purposes.\r
+                                                       Since the lifespan of the messages displayed in the pop-up is only going to be the\r
+                                                       same as that of the window, a <code><a href="#patternlayout">PatternLayout</a></code>\r
+                                                       is used that displays the time of the message and not the date (note that this is\r
+                                                       also true of PopUpAppender's default layout). The format of the string passed into\r
+                                                       PatternLayout is explained <a href="#patternlayout">below</a>.\r
+                                               </p>\r
+                                               <pre class="code">\r
+       var popUpAppender = new log4javascript.PopUpAppender();\r
+       var popUpLayout = new log4javascript.PatternLayout("%d{HH:mm:ss} %-5p - %m%n");\r
+       popUpAppender.setLayout(popUpLayout);\r
+       log.addAppender(popUpAppender);\r
+</pre>\r
+                                               <p>\r
+                                                       Suppose that we also want to send log messages to the server, but limited to\r
+                                                       error messages only. To achieve this we use an\r
+                                                       <code><a href="#ajaxappender">AjaxAppender</a></code>. Note that if no layout is\r
+                                                       specified then for convenience a default layout is used; in the case of\r
+                                                       AjaxAppender, that is <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>,\r
+                                                       which formats log messages as a standard HTTP POST string from which a simple\r
+                                                       server-side script (not provided with log4javascript) will be able to extract\r
+                                                       posted parameters. This is fine for our purposes:\r
+                                               </p>\r
+                                               <pre class="code">\r
+       var ajaxAppender = new log4javascript.AjaxAppender("myloggingservlet.do");\r
+       ajaxAppender.setThreshold(log4javascript.Level.<code>ERROR</code>);\r
+       log.addAppender(ajaxAppender);\r
+</pre>\r
+                                               <p>\r
+                                                       Finally, some test log messages and the closing script tag:\r
+                                               </p>\r
+                                               <pre class="code">\r
+       log.debug("Debugging message (appears in pop-up)");\r
+       log.error("Error message (appears in pop-up and in server log)");\r
+       //]]&gt;\r
+&lt;/script&gt;\r
+</pre>\r
+                                               <p>\r
+                                                       The full script:\r
+                                               </p>\r
+                                               <pre class="code">\r
+&lt;script type="text/javascript" src="log4javascript.js"&gt;&lt;/script&gt;\r
+&lt;script type="text/javascript"&gt;\r
+       //&lt;![CDATA[\r
+       var log = log4javascript.getLogger();\r
+       var popUpAppender = new log4javascript.PopUpAppender();\r
+       var popUpLayout = new log4javascript.PatternLayout("%d{HH:mm:ss} %-5p - %m%n");\r
+       popUpAppender.setLayout(popUpLayout);\r
+       log.addAppender(popUpAppender);\r
+       var ajaxAppender = new log4javascript.AjaxAppender("myloggingservlet.do");\r
+       ajaxAppender.setThreshold(log4javascript.Level.ERROR);\r
+       log.addAppender(ajaxAppender);\r
+       log.debug("Debugging message (appears in pop-up)");\r
+       log.error("Error message (appears in pop-up and in server log)");\r
+       //]]&gt;\r
+&lt;/script&gt;\r
+</pre>\r
+                                               <p>\r
+                                                       <a href="../examples/example_manual.html" title="View example (opens in new window)"\r
+                                                               target="_blank">See this example in action</a> (opens in new window)\r
+                                               </p>\r
+                                       </div>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="log4javascript">\r
+                                       <h2>log4javascript static properties/methods</h2>\r
+                                       <h4>Properties</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="property">\r
+                                                       <div class="name">version</div>\r
+                                                       <div class="summary">\r
+                                                               The version number of your copy of log4javascript.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="property">\r
+                                                       <div class="name">edition</div>\r
+                                                       <div class="summary">\r
+                                                               The edition of your copy of log4javascript.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="property">\r
+                                                       <div class="name">logLog</div>\r
+                                                       <div class="summary">\r
+                                                               log4javascript's internal logging object. <a href="#loglog">See below for more details</a>.\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <h4>Methods</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="method">\r
+                                                       <div class="name">getLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getLogger</strong>([String <em>loggerName</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">loggerName</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               <p>\r
+                                                                       Returns a logger with the specified name, creating it if a logger with that name does not\r
+                                                                       already exist. If no name is specified, a logger is returned with name <code>[anonymous]</code>, and\r
+                                                                       subsequent calls to <code>getLogger()</code> (with no logger name specified) will return\r
+                                                                       this same logger object.\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       Note that the names <code>[anonymous]</code>, <code>[default]</code>, <code>[null]</code>\r
+                                                                       and <code>root</code> are reserved for\r
+                                                                       the anonymous logger, default logger, null logger and root logger respectively.\r
+                                                               </p>\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getDefaultLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getDefaultLogger</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Convenience method that returns the default logger. The default logger\r
+                                                               has a single appender: a <code><a href="#popupappender">PopUpAppender</a></code>\r
+                                                               with the default layout, width and height, and with <code>focusPopUp</code> set to false\r
+                                                               and <code>lazyInit</code>, <code>useOldPopUp</code> and\r
+                                                               <code>complainAboutPopUpBlocking</code> all set to true.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getNullLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getNullLogger</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns an empty logger with no appenders. Useful for disabling all logging.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getRootLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getRootLogger</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns the root logger from which all other loggers derive.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">resetConfiguration</div>\r
+                                                       <div class="methodsignature"><code>void <strong>resetConfiguration</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Resets the all loggers to their default level.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setEnabled</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setEnabled</strong>(Boolean <em>enabled</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">enabled</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Enables or disables all logging, depending on <code>enabled</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns true or false depending on whether logging is enabled.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method" id="log4javascriptaddeventlistener">\r
+                                                       <div class="name">addEventListener</div>\r
+                                                       <div class="methodsignature"><code>void <strong>addEventListener</strong>(String <em>eventType</em>, Function <em>listener</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">eventType</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">listener</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               <p>\r
+                                                                       Adds a function to be called when an event of the type specified occurs in log4javascript.\r
+                                                                       Supported event types are <code>load</code> (occurs once the page has loaded) and\r
+                                                                       <code>error</code>.\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       Each listener is pased three paramaters:\r
+                                                               </p>\r
+                                                               <ul>\r
+                                                                       <li><code>sender</code>. The object that raised the event (i.e. the log4javascript object);</li>\r
+                                                                       <li><code>eventType</code>. The type of the event;</li>\r
+                                                                       <li>\r
+                                                                               <code>eventArgs</code>. An object containing of event-specific arguments. For the <code>error</code> event,\r
+                                                                               this is an object with properties <code>message</code> and <code>exception</code>. For the <code>load</code>\r
+                                                                               event this is an empty object.\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">removeEventListener</div>\r
+                                                       <div class="methodsignature"><code>void <strong>removeEventListener</strong>(String <em>eventType</em>, Function <em>listener</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">eventType</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">listener</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Removes the event listener function supplied for the event of the type specified.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">dispatchEvent</div>\r
+                                                       <div class="methodsignature"><code>void <strong>dispatchEvent</strong>(String <em>eventType</em>, Object <em>eventArgs</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">eventType</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">eventArgs</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Raises an event of type <code>eventType</code> on the <code>log4javascript</code> object.\r
+                                                               Each of the listeners for this type of event (registered via <code>addEventListener</code>)\r
+                                                               is called and passed <code>eventArgs</code> as the third parameter.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setEventTypes</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setEventTypes</strong>(Array <em>eventTypes</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">eventTypes</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Used internally to specify the types of events that the <code>log4javascript</code> object can raise.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setShowStackTraces</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setShowStackTraces</strong>(Boolean <em>show</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">show</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Enables or disables displaying of error stack traces, depending on <code>show</code>.\r
+                                                               By default, stack traces are not displayed. (Only works in Firefox)\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">evalInScope</div>\r
+                                                       <div class="methodsignature"><code>Object <strong>evalInScope</strong>(String <em>expr</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">expr</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               This evaluates the given expression in the log4javascript scope, thus allowing\r
+                                                               scripts to access internal log4javascript variables and functions. This was written\r
+                                                               for the purposes of automated testing but could be used by custom extensions to\r
+                                                               log4javascript.\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="levels">\r
+                                       <h2>Levels</h2>\r
+                                       <p>\r
+                                               Levels are available as static properties of the <code>log4javascript.Level</code>\r
+                                               object. In ascending order of severity:\r
+                                       </p>\r
+                                       <ol>\r
+                                               <li><code>log4javascript.Level.ALL</code></li>\r
+                                               <li><code>log4javascript.Level.TRACE</code></li>\r
+                                               <li><code>log4javascript.Level.DEBUG</code></li>\r
+                                               <li><code>log4javascript.Level.INFO</code></li>\r
+                                               <li><code>log4javascript.Level.WARN</code></li>\r
+                                               <li><code>log4javascript.Level.ERROR</code></li>\r
+                                               <li><code>log4javascript.Level.FATAL</code></li>\r
+                                               <li><code>log4javascript.Level.OFF</code></li>\r
+                                       </ol>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="loggers">\r
+                                       <h2>Loggers</h2>\r
+                                       <p>\r
+                                               It is possible to have multiple loggers in log4javascript. For example, you\r
+                                               may wish to have a logger for debugging purposes that logs messages to a\r
+                                               pop-up window and a separate logger that reports any client-side application\r
+                                               errors to the server via Ajax.\r
+                                       </p>\r
+                                       <div id="loggerhierarchy">\r
+                                               <h3>Logger hierarchy and appender additivity</h3>\r
+                                               <p>\r
+                                                       From version 1.4, log4javascript has hierarchical loggers, implemented in the same way\r
+                                                       as log4j. In summary, you specify a logger's parent logger by means of a dot between the\r
+                                                       parent logger name and the child logger name. Therefore the logger <code>tim.app.security</code>\r
+                                                       inherits from <code>tim.app</code>, which in turn inherits from <code>tim</code> which,\r
+                                                       finally, inherits from the root logger.\r
+                                               </p>\r
+                                               <p>\r
+                                                       What inheritance means for a logger is that in the absence of a threshold level set\r
+                                                       specifically on the logger it inherits its level from its parent; also, a logger inherits\r
+                                                       all its parent's appenders (this is known as <em>appender additivity</em> in log4j. This\r
+                                                       behaviour can be enabled or disabled via <code>setAdditivity()</code>. See below). In the\r
+                                                       above example, if the root logger has a level of <code>DEBUG</code> and one appender,\r
+                                                       each of the loggers <code>tim.app.security</code>, <code>tim.app</code> and <code>tim</code> would\r
+                                                       inherit the root level's appender. If, say, <code>tim.app</code>'s threshold level was set\r
+                                                       to <code>WARN</code>, <code>tim</code>'s effective level would remain at <code>DEBUG</code>\r
+                                                       (inherited from the root logger) while <code>tim.app.security</code>'s effective level would\r
+                                                       be <code>WARN</code>, inherited from <code>tim.app</code>. The important thing to note is\r
+                                                       that appenders accumulate down the logger hierarchy while levels are simply inherited from\r
+                                                       the nearest ancestor with a threshold level set.\r
+                                               </p>\r
+                                               <p>\r
+                                                       For a detailed explanation of the logger hierarchy, see the\r
+                                                       <a href="http://logging.apache.org/log4j/docs/manual.html" target="_blank"\r
+                                                          title="Log4j manual (opens in new window)">log4j manual</a>.\r
+                                               </p>\r
+                                       </div>\r
+                                       <p><strong>Notes</strong></p>\r
+                                       <ul>\r
+                                               <li>\r
+                                                       It is not possible to instantiate loggers directly. Instead you must use\r
+                                                       one of the methods of the <code>log4javascript</code> object: <code>getLogger</code>,\r
+                                                       <code>getRootLogger</code>, <code>getDefaultLogger</code> or <code>getNullLogger</code>.\r
+                                               </li>\r
+                                       </ul>\r
+                                       <h4>Logger methods</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="method">\r
+                                                       <div class="name">addAppender</div>\r
+                                                       <div class="methodsignature"><code>void <strong>addAppender</strong>(Appender <em>appender</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">appender</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Adds the given appender.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">removeAppender</div>\r
+                                                       <div class="methodsignature"><code>void <strong>removeAppender</strong>(Appender <em>appender</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">appender</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Removes the given appender.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">removeAllAppenders</div>\r
+                                                       <div class="methodsignature"><code>void <strong>removeAllAppenders</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Clears all appenders for the current logger.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setLevel</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setLevel</strong>(Level <em>level</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Sets the level. Log messages of a lower level than <code>level</code> will not be logged.\r
+                                                               Default value is <code>DEBUG</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getLevel</div>\r
+                                                       <div class="methodsignature"><code>Level <strong>getLevel</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns the level explicitly set for this logger or <code>null</code> if none has been set.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getEffectiveLevel</div>\r
+                                                       <div class="methodsignature"><code>Level <strong>getEffectiveLevel</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns the level at which the logger is operating. This is either the level explicitly\r
+                                                               set on the logger or, if no level has been set, the effective level of the logger's parent.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setAdditivity</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setAdditivity</strong>(Boolean <em>additivity</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">additivity</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               <p>\r
+                                                                       Sets whether appender additivity is enabled (the default) or disabled. If set to false, this\r
+                                                                       particular logger will not inherit any appenders form its ancestors. Any descendant of this\r
+                                                                       logger, however, will inherit from its ancestors as normal, unless its own additivity is\r
+                                                                       explicitly set to false.\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       Default value is <code>true</code>.\r
+                                                               </p>\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getAdditivity</div>\r
+                                                       <div class="methodsignature"><code>Level <strong>getLevel</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether additivity is enabled for this logger.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">log</div>\r
+                                                       <div class="methodsignature"><code>void <strong>log</strong>(Level <em>level</em>, Object <em>params</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">params</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Generic logging method used by wrapper methods such as <code>debug</code>,\r
+                                                               <code>error</code> etc.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       The signature of this method has changed in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">trace</div>\r
+                                                       <div class="methodsignature"><code>void <strong>trace</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>TRACE</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">debug</div>\r
+                                                       <div class="methodsignature"><code>void <strong>debug</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>DEBUG</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">info</div>\r
+                                                       <div class="methodsignature"><code>void <strong>info</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>INFO</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">warn</div>\r
+                                                       <div class="methodsignature"><code>void <strong>warn</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>WARN</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">error</div>\r
+                                                       <div class="methodsignature"><code>void <strong>error</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>ERROR</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">fatal</div>\r
+                                                       <div class="methodsignature"><code>void <strong>fatal</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>FATAL</code>.\r
+                                                       </div>\r
+                                                       <p><strong>Notes</strong></p>\r
+                                                       <ul>\r
+                                                               <li>\r
+                                                                       Logging of multiple messages in one call is new in 1.4.\r
+                                                               </li>\r
+                                                       </ul>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isEnabledFor</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isEnabledFor</strong>(Level <em>level</em>, Error <em>exception</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for the specified level. \r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isTraceEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isTraceEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>TRACE</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isDebugEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isDebugEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>DEBUG</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isInfoEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isInfoEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>INFO</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isWarnEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isWarnEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>WARN</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isErrorEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isErrorEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>ERROR</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isFatalEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isFatalEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>FATAL</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">group</div>\r
+                                                       <div class="methodsignature"><code>void <strong>group</strong>(String <em>name</em>, Boolean <em>initiallyExpanded</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">name</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">initiallyExpanded</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Starts a new group of log messages. In appenders that support grouping (currently\r
+                                                               <code><a href="#popupappender">PopUpAppender</a></code> and\r
+                                                               <code><a href="#inpageappender">InPageAppender</a></code>), a group appears as an expandable\r
+                                                               section in the console, labelled with the <code>name</code> specified.\r
+                                                               Specifying <code>initiallyExpanded</code> determines whether the\r
+                                                               group starts off expanded (the default is <code>true</code>). Groups may be nested.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">groupEnd</div>\r
+                                                       <div class="methodsignature"><code>void <strong>groupEnd</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Ends the current group. If there is no group then this function has no effect.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">time</div>\r
+                                                       <div class="methodsignature"><code>void <strong>time</strong>(String <em>name</em>, Level <em>level</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">name</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Starts a timer with name <code>name</code>. When the timer is ended with a\r
+                                                               call to <code>timeEnd</code> using the same name, the amount of time that\r
+                                                               has elapsed in milliseconds since the timer was started is logged at level\r
+                                                               <code>level</code>. If not level is supplied, the level defaults to <code>INFO</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">timeEnd</div>\r
+                                                       <div class="methodsignature"><code>void <strong>timeEnd</strong>(String <em>name</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">name</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Ends the timer with name <code>name</code> and logs the time elapsed.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">assert</div>\r
+                                                       <div class="methodsignature"><code>void <strong>assert</strong>(Object <em>expr</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">expr</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Asserts the given expression is <code>true</code> or evaluates to <code>true</code>.\r
+                                                               If so, nothing is logged. If not, an error is logged at the <code>ERROR</code> level.\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="appenders">\r
+                                       <h2>Appenders</h2>\r
+                                       <div id="appender">\r
+                                               <h3>Appender</h3>\r
+                                               <p>\r
+                                                       There are methods common to all appenders, as listed below.\r
+                                               </p>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">doAppend</div>\r
+                                                               <div class="methodsignature"><code>void <strong>doAppend</strong>(LoggingEvent <em>loggingEvent</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">loggingEvent</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Checks the logging event's level is at least as severe as the appender's\r
+                                                                               threshold and calls the appender's <code>append</code> method if so.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               This method should not in general be used directly or overridden.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">append</div>\r
+                                                               <div class="methodsignature"><code>void <strong>append</strong>(LoggingEvent <em>loggingEvent</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">loggingEvent</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Appender-specific method to append a log message. Every appender object should implement\r
+                                                                       this method.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setLayout</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setLayout</strong>(Layout <em>layout</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">layout</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Sets the appender's layout.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getLayout</div>\r
+                                                               <div class="methodsignature"><code>Layout <strong>getLayout</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the appender's layout.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setThreshold</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setThreshold</strong>(Level <em>level</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">level</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Sets the appender's threshold. Log messages of level less severe than this\r
+                                                                       threshold will not be logged.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getThreshold</div>\r
+                                                               <div class="methodsignature"><code>Level <strong>getThreshold</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the appender's threshold.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">toString</div>\r
+                                                               <div class="methodsignature"><code>string <strong>toString</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns a string representation of the appender. Every appender object should implement\r
+                                                                       this method.\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="alertappender">\r
+                                               <h3>AlertAppender</h3>\r
+                                               <p class="editions">Editions: <strong>Standard</strong></p>\r
+                                               <p>\r
+                                                       Displays a log message as a JavaScript alert.\r
+                                               </p>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">AlertAppender</div>\r
+                                                               <div class="methodsignature"><code><strong>AlertAppender</strong>()</code></div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="ajaxappender">\r
+                                               <h3>AjaxAppender</h3>\r
+                                               <p class="editions">Editions: <strong>Standard, Production</strong></p>\r
+                                               <p>\r
+                                                       A flexible appender that asynchronously  sends log messages to a server via HTTP\r
+                                                       (Ajax, if you insist, though the 'x' of Ajax only comes into play in any form if you use an\r
+                                                       <code><a href="#xmllayout">XmlLayout</a></code>).\r
+                                               </p>\r
+                                               <p>\r
+                                                       The default configuration is to send each log message as a separate HTTP post\r
+                                                       request to the server using an <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>,\r
+                                                       without waiting for a response before sending any subsequent requests. However,\r
+                                                       an <code>AjaxAppender</code> may be configured to do any one of or combinations of the following:\r
+                                               </p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               send log messages in batches (if the selected layout supports it - particularly suited\r
+                                                               to <code>AjaxAppender</code> are <code><a href="#jsonlayout">JsonLayout</a></code> and\r
+                                                               <code><a href="#xmllayout">XmlLayout</a></code>, both of which allow batching);\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               wait for a response from a previous request before sending the next log message / batch\r
+                                                               of messages;\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               send all queued log messages at timed intervals.\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               AjaxAppender relies on the <code>XMLHttpRequest</code> object. It also requires\r
+                                                               the presence of correctly implemented <code>setRequestHeader</code> method on\r
+                                                               this object, which rules out Opera prior to version 8.01. If your browser does not\r
+                                                               support the necessary objects then one alert will display to explain why it\r
+                                                               doesn't work, after which the appender will silently switch off.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               In AjaxAppender only, <code>setLayout</code> may not be called after the first\r
+                                                               message has been logged.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               The default layout is <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               From version 1.4, log message data is always sent as one or more name/value pairs.\r
+                                                               In the case of <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>, data\r
+                                                               is sent the same as in previous versions. For other layouts such as\r
+                                                               <code><a href="#jsonlayout">JsonLayout</a></code> and\r
+                                                               <code><a href="#xmllayout">XmlLayout</a></code>, the formatted log message is posted as\r
+                                                               the value of a parameter called <code>data</code>, though this may be changed via\r
+                                                               <code>setPostVarName</code>.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               From version 1.4, log message timestamps are sent as standard JavaScript times, i.e.\r
+                                                               the number of milliseconds since 00:00:00 UTC on January 1, 1970.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       Also from version 1.4, any outstanding log messages may optionally be sent when the\r
+                                                                       main page unloads (i.e. user follows a link, closes the window or refreshes the\r
+                                                                       page). This behaviour may be enabled using <code>setSendAllOnUnload</code>; see\r
+                                                                       below.\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       This behaviour is dependent on <code>window.onbeforeunload</code>; unfortunately,\r
+                                                                       Opera does not always raise this event, so this feature does not work reliably in\r
+                                                                       Opera.\r
+                                                               </p>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">AjaxAppender</div>\r
+                                                               <div class="methodsignature">\r
+                                                                       <code><strong>AjaxAppender</strong>(String <em>url</em>)</code>\r
+                                                               </div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">url</code>\r
+                                                                               <div>\r
+                                                                                       The URL to which log messages should be sent. Note that this is subject\r
+                                                                                       to the usual Ajax restrictions: the URL should be in the same domain as that\r
+                                                                                       of the page making the request.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">setSendAllOnUnload</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setSendAllOnUnload</strong>(Boolean <em>sendAllOnUnload</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Whether to send all remaining unsent log messages to the server when the page\r
+                                                                               unloads.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Since version 1.4.3, the default value is <code>false</code>. Previously the\r
+                                                                               default was <code>true</code>.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       This feature was found not to work prior to version 1.4.3 in WebKit\r
+                                                                                       browsers (e.g. Google Chrome, Safari). As a result, a workaround was\r
+                                                                                       implemented in 1.4.3 which has the unfortunate side effect of popping up a\r
+                                                                                       confirmation dialog to the user if there are any log messages to send when\r
+                                                                                       the page unloads. As a result, this feature is now obtrusive for the user\r
+                                                                                       and is therefore disabled by default.\r
+                                                                               </li>\r
+                                                                               <li>\r
+                                                                                       This feature does not work in any version of Opera.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isSendAllOnUnload</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isSendAllOnUnload</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether all remaining unsent log messages are sent to the server when the page unloads.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setPostVarName</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setPostVarName</strong>(String <em>postVarName</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Sets the post variable name whose value will the formatted log message(s) for\r
+                                                                               each request.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Default value is <code>data</code>.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       This has no effect if the current layout is an\r
+                                                                                       <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getPostVarName</div>\r
+                                                               <div class="methodsignature"><code>String <strong>getPostVarName</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the post variable name whose value will the formatted log message(s) for\r
+                                                                       each request.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setTimed</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setTimed</strong>(Boolean <em>timed</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Whether to send log messages to the server at regular, timed intervals.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Default value is <code>false</code>.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isTimed</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isTimed</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether log messages are sent to the server at regular, timed intervals.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setWaitForResponse</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setWaitForResponse</strong>(Boolean <em>waitForResponse</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Sets whether to wait for a response from a previous HTTP request from this\r
+                                                                               appender before sending the next log message / batch of messages.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Default value is <code>false</code>.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isWaitForResponse</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isWaitForResponse</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the appender waits for a response from a previous HTTP request from this\r
+                                                                       appender before sending the next log message / batch of messages.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setBatchSize</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setBatchSize</strong>(Number <em>batchSize</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Sets the number of log messages to send in each request. If not specified,\r
+                                                                               defaults to <code>1</code>.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       Setting this to a number greater than 1 means that the appender will wait\r
+                                                                                       until it has forwarded that many valid log messages before sending any more.\r
+                                                                                       This also means that if the page unloads for any reason and <code>sendAllOnUnload</code>\r
+                                                                                       is not set to <code>true</code>, any log messages waiting in the queue will not be sent.\r
+                                                                               </li>\r
+                                                                               <li>\r
+                                                                                       If batching is used in conjunction with timed sending of log messages,\r
+                                                                                       messages will still be sent in batches of size <code>batchSize</code>,\r
+                                                                                       regardless of how many log messages are queued by the time the timed\r
+                                                                                       sending is invoked. Incomplete batches will not be sent except when the\r
+                                                                                       page unloads, if <code>sendAllOnUnload</code> is set to <code>true</code>.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getBatchSize</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getBatchSize</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the number of log messages sent in each request. See above for more details.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setTimerInterval</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setTimerInterval</strong>(Number <em>timerInterval</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               [<em>not available after first message logged</em>]\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               Sets the length of time in milliseconds between each sending of queued log\r
+                                                                               messages.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       <code>timerInterval</code> only has an effect in conjunction with\r
+                                                                                       <code>timed</code> (set by <code>setTimed()</code>. If <code>timed</code>\r
+                                                                                       is set to false then <code>timerInterval</code> has no effect.\r
+                                                                               </li>\r
+                                                                               <li>\r
+                                                                                       Each time the queue of log messages or batches of messages is cleared,\r
+                                                                                       the countdown to the next sending only starts once the final request\r
+                                                                                       has been sent (and, if <code>waitForResponse</code> is set to <code>true</code>,\r
+                                                                                       the final response received). This means that the actual interval at\r
+                                                                                       which the queue of messages is cleared cannot be fixed.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getTimerInterval</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getTimerInterval</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the length of time in milliseconds between each sending of queued log\r
+                                                                       messages. See above for more details.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setRequestSuccessCallback</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setRequestSuccessCallback</strong>(Function <em>requestSuccessCallback</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Sets the function that is called whenever a successful request is made, called at the\r
+                                                                               point at which the response is received. This feature can be used to confirm\r
+                                                                               whether a request has been successful and act accordingly.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               A single parameter, <code>xmlHttp</code>, is passed to the callback function.\r
+                                                                               This is the XMLHttpRequest object that performed the request.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setFailCallback</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setFailCallback</strong>(Function <em>failCallback</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Sets the function that is called whenever any kind of failure occurs in the appender,\r
+                                                                               including browser deficiencies or configuration errors (e.g. supplying a\r
+                                                                               non-existent URL to the appender). This feature can be used to handle\r
+                                                                               AjaxAppender-specific errors.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               A single parameter, <code>message</code>, is passed to the callback function.\r
+                                                                               This is the error-specific message that caused the failure.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setSessionId</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setSessionId</strong>(String <em>sessionId</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the session id sent to the server each time a request is made.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getSessionId</div>\r
+                                                               <div class="methodsignature"><code>String <strong>getSessionId</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the session id sent to the server each time a request is made.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">addHeader</div>\r
+                                                               <div class="methodsignature"><code>void <strong>addHeader</strong>(String <em>name</em>,\r
+                                                                       String <em>value</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Adds an HTTP header that is sent with each request.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               <strong>Since: 1.4.3</strong>\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getHeaders</div>\r
+                                                               <div class="methodsignature"><code>Array <strong>getHeaders</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns an array of the additional headers that are sent with each HTTP request.\r
+                                                                       Each array item is an object with properties <code>name</code> and\r
+                                                                       <code>value</code>.\r
+                                                                       <p>\r
+                                                                               <strong>Since: 1.4.3</strong>\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">sendAll</div>\r
+                                                               <div class="methodsignature"><code>void <strong>sendAll</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sends all log messages in the queue. If log messages are batched then only completed\r
+                                                                       batches are sent.\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="popupappender">\r
+                                               <h3>PopUpAppender</h3>\r
+                                               <p class="editions">Editions: <strong>Standard</strong></p>\r
+                                               <p>\r
+                                                       Logs messages to a pop-up console window (note: you will need to disable pop-up\r
+                                                       blockers to use it). The pop-up displays a list of all log messages, and has\r
+                                                       the following features:\r
+                                               </p>\r
+                                               <ul>\r
+                                                       <li>log messages are colour-coded by severity;</li>\r
+                                                       <li>log messages are displayed in a monospace font to allow easy readability;</li>\r
+                                                       <li>switchable wrap mode to allow wrapping of long lines</li>\r
+                                                       <li>all whitespace in log messages is honoured (except in wrap mode);</li>\r
+                                                       <li>filters to show and hide messages of a particular level;</li>\r
+                                                       <li>\r
+                                                               search facility that allows searching of log messages as you type, with the\r
+                                                               following features:\r
+                                                               <ul>\r
+                                                                       <li>supports regular expressions;</li>\r
+                                                                       <li>case sensitive or insensitive matching;</li>\r
+                                                                       <li>buttons to navigate through all the matches;</li>\r
+                                                                       <li>switch to highlight all matches;</li>\r
+                                                                       <li>switch to filter out all log messages that contain no matches;</li>\r
+                                                                       <li>switch to enable or disable the search;</li>\r
+                                                                       <li>search is dynamically applied to every log message as it is added to the console.</li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                                       <li>switch to toggle between logging from the top down and from the bottom up;</li>\r
+                                                       <li>switch to turn automatic scrolling when a new message is logged on and off;</li>\r
+                                                       <li>switch to turn off all logging to the pop-up (useful if a timer is generating unwanted log messages);</li>\r
+                                                       <li>optional configurable limit to the number of log message that are displayed. If\r
+                                                               set and this limit is reached, each new log message will cause the oldest one to\r
+                                                               be discarded;</li>\r
+                                                       <li>grouped log messages. Groups may be nested and each has a button to show or hide the log messages in that group;</li>\r
+                                                       <li>clear button to allow user to delete all current log messages.</li>\r
+                                                       <li>\r
+                                                               command prompt with up/down arrow history. Command line functions may be added\r
+                                                               to the appender. Several command line functions are built in:\r
+                                                               <ul class="propertieslist">\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>$</strong>(String <em>id</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Prints a string representation of a single element with the id supplied.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>dir</strong>(Object <em>obj</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Prints a list of a properties of the object supplied.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>dirxml</strong>(HTMLElement <em>el</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Prints the XML source code of an HTML or XML element\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>cd</strong>(Object <em>win</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Changes the scope of execution of commands to the named frame or window (either a\r
+                                                                                       window/frame name or a reference to a window object may be supplied).\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>clear</strong>()</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Clears the console.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>keys</strong>(Object <em>obj</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Prints a list of the names of all properties of the object supplied.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>values</strong>(Object <em>obj</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Prints a list of the values of all properties of the object supplied.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="method">\r
+                                                                               <div class="methodsignature"><code><strong>expansionDepth</strong>(Number <em>depth</em>)</code></div>\r
+                                                                               <div class="summary">\r
+                                                                                       Sets the number of levels of expansion of objects that are displayed by\r
+                                                                                       the command line. The default value is 1.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       The default layout for this appender is <code><a href="#patternlayout">PatternLayout</a></code>\r
+                                                                       with pattern string\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       <code>%d{HH:mm:ss} %-5p - %m{1}%n</code>\r
+                                                               </p>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">PopUpAppender</div>\r
+                                                               <div class="methodsignature">\r
+                                                                       <code><strong>PopUpAppender</strong>([Boolean <em>lazyInit</em>,\r
+                                                                       Boolean <em>initiallyMinimized</em>, Boolean <em>useDocumentWrite</em>,\r
+                                                                       Number <em>width</em>, Number <em>height</em>])</code>\r
+                                                               </div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">lazyInit</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       Set this to <code>true</code> to open the pop-up only when the first log\r
+                                                                                       message reaches the appender. Otherwise, the pop-up window opens as soon as the\r
+                                                                                       appender is created. If not specified, defaults to <code>false</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">initiallyMinimized</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       <p>\r
+                                                                                               Whether the console window should start off hidden / minimized.\r
+                                                                                               If not specified, defaults to <code>false</code>.\r
+                                                                                       </p>\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">useDocumentWrite</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       <p>\r
+                                                                                               Specifies how the console window is created. By default, the console window is\r
+                                                                                               created dynamically using <code>document</code>'s <code>write</code> method. This has the\r
+                                                                                               advantage of keeping all the code in one single JavaScript file. However, if your\r
+                                                                                               page sets <code>document.domain</code> then the browser prevents script access to\r
+                                                                                               a window unless it too has the same value set for <code>document.domain</code>. To\r
+                                                                                               get round this issue, you can set <code>useDocumentWrite</code> to <code>false</code>\r
+                                                                                               and log4javascript will instead use the external HTML file <code>console.html</code>\r
+                                                                                               (or <code>console_uncompressed.html</code> if you're using an uncompressed version of\r
+                                                                                               log4javascript.js), which must be placed in the same directory as your log4javascript.js file.\r
+                                                                                       </p>\r
+                                                                                       <p>\r
+                                                                                               Note that if <code>useDocumentWrite</code> is set to <code>true</code>, the old pop-up\r
+                                                                                               window will always be closed and a new one created whenever the page is refreshed, even\r
+                                                                                               if <code>setUseOldPopUp(true)</code> has been called.\r
+                                                                                       </p>\r
+                                                                                       <p>\r
+                                                                                               In general it's simpler to use the <code>document.write</code> method, so unless your\r
+                                                                                               page needs to set <code>document.domain</code>, <code>useDocumentWrite</code> should\r
+                                                                                               be set to <code>true</code>.\r
+                                                                                       </p>\r
+                                                                                       <p>\r
+                                                                                               If not specified, defaults to <code>true</code>.\r
+                                                                                       </p>\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">width</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       The outer width in pixels of the pop-up window. If not specified,\r
+                                                                                       defaults to <code>600</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">height</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       The outer height in pixels of the pop-up window. If not specified,\r
+                                                                                       defaults to <code>400</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">isInitiallyMinimized</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isInitiallyMinimized</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the console window starts off hidden / minimized.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setInitiallyMinimized</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setInitiallyMinimized</strong>(Boolean <em>initiallyMinimized</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets whether the console window should start off hidden / minimized.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isFocusPopUp</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isFocusPopUp</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the pop-up window is focussed (i.e. brought it to the front)\r
+                                                                       when a new log message is added. Default value is <code>false</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setFocusPopUp</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setFocusPopUp</strong>(Boolean <em>focusPopUp</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to focus the pop-up window (i.e. bring it to the front)\r
+                                                                       when a new log message is added.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isUseOldPopUp</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isUseOldPopUp</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Returns whether the same pop-up window is used if the main page is\r
+                                                                               reloaded. If set to <code>true</code>, when the page is reloaded\r
+                                                                               a line is drawn in the pop-up and subsequent log messages are added\r
+                                                                               to the same pop-up. Otherwise, a new pop-up window is created that\r
+                                                                               replaces the original pop-up. If not specified, defaults to\r
+                                                                               <code>true</code>.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       In Internet Explorer 5, the browser prevents this from working\r
+                                                                                       properly, so a new pop-up window is always created when the main\r
+                                                                                       page reloads. Also, the original pop-up does not get closed.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setUseOldPopUp</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setUseOldPopUp</strong>(Boolean <em>useOldPopUp</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets whether to use the same pop-up window if the main page is reloaded.\r
+                                                                       See <code>isUseOldPopUp</code> above for details.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isComplainAboutPopUpBlocking</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isComplainAboutPopUpBlocking</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether an alert is shown to the user when the pop-up window\r
+                                                                       cannot be created as a result of a pop-up blocker. Default value is <code>true</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setComplainAboutPopUpBlocking</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setComplainAboutPopUpBlocking</strong>(Boolean <em>complainAboutPopUpBlocking</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets whether to announce to show an alert to the user when the pop-up window\r
+                                                                       cannot be created as a result of a pop-up blocker.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isNewestMessageAtTop</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isNewestMessageAtTop</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether new log messages are displayed at the top of the pop-up window.\r
+                                                                       Default value is <code>false</code> (i.e. log messages are appended to the bottom of the window).\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setNewestMessageAtTop</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setNewestMessageAtTop</strong>(Boolean <em>newestMessageAtTop</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to display new log messages at the top inside the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isScrollToLatestMessage</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isScrollToLatestMessage</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the pop-up window scrolls to display the latest log message when a new message\r
+                                                                       is logged. Default value is <code>true</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setScrollToLatestMessage</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setScrollToLatestMessage</strong>(Boolean <em>scrollToLatestMessage</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to scroll the pop-up window to display the latest log message when a new message\r
+                                                                       is logged.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isReopenWhenClosed</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isReopenWhenClosed</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the pop-up window reopens automatically after being closed when a new log message is logged.\r
+                                                                       Default value is <code>false</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setReopenWhenClosed</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setReopenWhenClosed</strong>(Boolean <em>reopenWhenClosed</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to reopen the pop-up window automatically after being closed when a new log message is logged.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getWidth</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getWidth</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the outer width in pixels of the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setWidth</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setWidth</strong>(Number <em>width</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets the outer width in pixels of the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getHeight</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getHeight</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Returns the outer height in pixels of the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setHeight</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setHeight</strong>(Number <em>height</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the outer height in pixels of the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getMaxMessages</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getMaxMessages</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the largest number of log messages that are displayed and stored\r
+                                                                       by the the console. Once reached, a new log message wil cause the\r
+                                                                       oldest message to be discarded.  Default value is <code>null</code>, which means no\r
+                                                                       limit is applied.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setMaxMessages</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setMaxMessages</strong>(Number <em>maxMessages</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets the largest number of messages displayed and stored by the console window. Set\r
+                                                                       this to <code>null</code> to make this number unlimited.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isShowCommandLine</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isShowCommandLine</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the console includes a command line.\r
+                                                                       Default value is <code>true</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setShowCommandLine</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setShowCommandLine</strong>(Boolean <em>showCommandLine</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether the console includes a command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandLineObjectExpansionDepth</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getCommandLineObjectExpansionDepth</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the number of levels to expand when an object value is logged to the console.\r
+                                                                       Each property of an object above this threshold will be expanded if it is itself an object\r
+                                                                       or array, otherwise its string representation will be displayed. Default value is 1 (i.e.\r
+                                                                       the properties of the object logged will be displayed in their string representation but\r
+                                                                       not expanded).\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandLineObjectExpansionDepth:</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandLineObjectExpansionDepth</strong>(Number <em>expansionDepth</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the number of levels to expand when an object value is logged to the console.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandWindow</div>\r
+                                                               <div class="methodsignature"><code>Window <strong>getCommandWindow</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns a reference to the window in which commands typed into the command line\r
+                                                                       are currently being executed.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandWindow</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandWindow</strong>(Window <em>commandWindow</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the window in which commands typed into the command line are executed.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandLayout</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getCommandLayout</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the layout used to format the output for commands typed into the command line.\r
+                                                                       The default value is a <code><a href="#patternlayout">PatternLayout</a></code> with\r
+                                                                       pattern string <code>%m</code>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandLayout</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandLayout</strong>(Layout <em>commandLayout</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the layout used to format the output for commands typed into the command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">clear</div>\r
+                                                               <div class="methodsignature"><code>void <strong>clear</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Clears all messages from the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">close</div>\r
+                                                               <div class="methodsignature"><code>void <strong>close</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Closes the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">show</div>\r
+                                                               <div class="methodsignature"><code>void <strong>show</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Opens the pop-up window, if not already open.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">hide</div>\r
+                                                               <div class="methodsignature"><code>void <strong>hide</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Closes the pop-up window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focus</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focus</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives it the focus.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focusCommandLine</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focusCommandLine</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives the focus to the command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focusSearch</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focusSearch</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives the focus to the search box.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">evalCommandAndAppend</div>\r
+                                                               <div class="methodsignature"><code>void <strong>evalCommandAndAppend</strong>(String <em>expr</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Evaluates the expression and appends the result to the console.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">addCommandLineFunction</div>\r
+                                                               <div class="methodsignature"><code>void <strong>addCommandLineFunction</strong>(String <em>functionName</em>, Function <em>commandLineFunction</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Adds a function with the name specified to the list of functions available on the command line.\r
+                                                                               This feature may be used to add custom functions to the command line.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               When you call the function on the command line, <code>commandLineFunction</code> is executed with the\r
+                                                                               following three parameters:\r
+                                                                       </p>\r
+                                                                       <ul>\r
+                                                                               <li><em>appender</em>. A reference to the appender in which the command was executed;</li>\r
+                                                                               <li><em>args</em>.\r
+                                                                                       An array-like list of parameters passed into the function on the command line\r
+                                                                                       (actually a reference to the <code>arguments</code> object representing the parameters passed\r
+                                                                                       into the function by the user);</li>\r
+                                                                               <li><em>returnValue</em>. This is an object with two properties that allow the function to control\r
+                                                                                       how the result is displayed:\r
+                                                                                       <ul>\r
+                                                                                               <li><em>appendResult</em>. A boolean value that determines whether the returned value from this\r
+                                                                                                       function is appended to the console. The default value is <code>true</code>;</li>\r
+                                                                                               <li><em>isError</em>. A boolean value that specifies whether the output of this function\r
+                                                                                                       should be displayed as an error. The default value is <code>false</code>.</li>\r
+                                                                                       </ul>\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                                       <p>\r
+                                                                               The value returned by the function is formatted by the command layout and appended to the console.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="inpageappender">\r
+                                               <h3>InPageAppender</h3>\r
+                                               <p class="editions">Editions: <strong>Standard</strong></p>\r
+                                               <p>\r
+                                                       Logs messages to a console window in the page. The console is identical\r
+                                                       to that used by the <code><a href="#popupappender">PopUpAppender</a></code>, except\r
+                                                       for the absence of a 'Close' button.\r
+                                               </p>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               Prior to log4javascript 1.3, InPageAppender was known as InlineAppender.\r
+                                                               For the sake of backwards compatibility, InlineAppender is still included in\r
+                                                               1.3 and later as an alias for InPageAppender.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       The default layout for this appender is <code><a href="#patternlayout">PatternLayout</a></code>\r
+                                                                       with pattern string\r
+                                                               </p>\r
+                                                               <p>\r
+                                                                       <code>%d{HH:mm:ss} %-5p - %m{1}%n</code>\r
+                                                               </p>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">InPageAppender</div>\r
+                                                               <div class="methodsignature">\r
+                                                                       <code><strong>InPageAppender</strong>(HTMLElement <em>container</em>[,\r
+                                                                       Boolean <em>lazyInit</em>, Boolean <em>initiallyMinimized</em>,\r
+                                                                       Boolean <em>useDocumentWrite</em>, String <em>width</em>, String <em>height</em>])</code>\r
+                                                               </div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">container</code>\r
+                                                                               <div>\r
+                                                                                       The container element for the console window. This should be an HTML element.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">lazyInit</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       Set this to <code>true</code> to create the console only when the first log\r
+                                                                                       message reaches the appender. Otherwise, the console is initialized as soon as the\r
+                                                                                       appender is created. If not specified, defaults to <code>true</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">initiallyMinimized</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       <p>\r
+                                                                                               Whether the console window should start off hidden / minimized.\r
+                                                                                               If not specified, defaults to <code>false</code>.\r
+                                                                                       </p>\r
+                                                                                       <p><strong>Notes</strong></p>\r
+                                                                                       <ul>\r
+                                                                                               <li>\r
+                                                                                                       In Safari (and possibly other browsers) hiding an <code>iframe</code>\r
+                                                                                                       resets its document, thus destroying the console window.\r
+                                                                                               </li>\r
+                                                                                       </ul>\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">useDocumentWrite</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       <p>\r
+                                                                                               Specifies how the console window is created. By default, the console window is\r
+                                                                                               created dynamically using <code>document</code>'s <code>write</code> method. This has the\r
+                                                                                               advantage of keeping all the code in one single JavaScript file. However, if your\r
+                                                                                               page sets <code>document.domain</code> then the browser prevents script access to\r
+                                                                                               a window unless it too has the same value set for <code>document.domain</code>. To\r
+                                                                                               get round this issue, you can set <code>useDocumentWrite</code> to <code>false</code>\r
+                                                                                               and log4javascript will instead use the external HTML file <code>console.html</code>\r
+                                                                                               (or <code>console_uncompressed.html</code> if you're using an uncompressed version of\r
+                                                                                               log4javascript.js), which must be placed in the same directory as your log4javascript.js file.\r
+                                                                                       </p>\r
+                                                                                       <p>\r
+                                                                                               In general it's simpler to use the <code>document.write</code> method, so unless your\r
+                                                                                               page needs to set <code>document.domain</code>, <code>useDocumentWrite</code> should\r
+                                                                                               be set to <code>true</code>.\r
+                                                                                       </p>\r
+                                                                                       <p>\r
+                                                                                               If not specified, defaults to <code>true</code>.\r
+                                                                                       </p>\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">width</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       The width of the console window. Any valid CSS length may be used. If not\r
+                                                                                       specified, defaults to <code>100%</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">height</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                               <div>\r
+                                                                                       The height of the console window. Any valid CSS length may be used. If not\r
+                                                                                       specified, defaults to <code>250px</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">addCssProperty</div>\r
+                                                               <div class="methodsignature"><code>void <strong>addCssProperty</strong>(String <em>name</em>, String <em>value</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets a CSS style property on the HTML element containing the console iframe.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isVisible</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isVisible</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the console window is currently visible.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isInitiallyMinimized</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isInitiallyMinimized</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the console window starts off hidden / minimized.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setInitiallyMinimized</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setInitiallyMinimized</strong>(Boolean <em>initiallyMinimized</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets whether the console window should start off hidden / minimized.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isNewestMessageAtTop</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isNewestMessageAtTop</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether new log messages are displayed at the top of the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setNewestMessageAtTop</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setNewestMessageAtTop</strong>(Boolean <em>newestMessageAtTop</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to display new log messages at the top inside the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isScrollToLatestMessage</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isScrollToLatestMessage</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the pop-up window scrolls to display the latest log message when a new message\r
+                                                                       is logged.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setScrollToLatestMessage</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setScrollToLatestMessage</strong>(Boolean <em>scrollToLatestMessage</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether to scroll the console window to display the latest log message when a new message\r
+                                                                       is logged.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getWidth</div>\r
+                                                               <div class="methodsignature"><code>String <strong>getWidth</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the outer width of the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setWidth</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setWidth</strong>(String <em>width</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets the outer width of the console window. Any valid CSS length may be used.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getHeight</div>\r
+                                                               <div class="methodsignature"><code>String <strong>getHeight</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the outer height of the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setHeight</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setHeight</strong>(String <em>height</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets the outer height of the console window. Any valid CSS length may be used.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getMaxMessages</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getMaxMessages</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the largest number of messages displayed and stored by the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setMaxMessages</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setMaxMessages</strong>(Number <em>maxMessages</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       [<em>not available after initialization</em>]\r
+                                                                       <br />\r
+                                                                       Sets the largest number of messages displayed and stored by the console window. Set\r
+                                                                       this to <code>null</code> to make this number unlimited.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">isShowCommandLine</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isShowCommandLine</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the console includes a command line.\r
+                                                                       Default value is <code>true</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setShowCommandLine</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setShowCommandLine</strong>(Boolean <em>showCommandLine</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether the console includes a command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandLineObjectExpansionDepth</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getCommandLineObjectExpansionDepth</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the number of levels to expand when an object value is logged to the console.\r
+                                                                       Each property of an object above this threshold will be expanded if it is itself an object\r
+                                                                       or array, otherwise its string representation will be displayed. Default value is 1 (i.e.\r
+                                                                       the properties of the object logged will be displayed in their string representation but\r
+                                                                       not expanded).\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandLineObjectExpansionDepth:</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandLineObjectExpansionDepth</strong>(Number <em>expansionDepth</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the number of levels to expand when an object value is logged to the console.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandWindow</div>\r
+                                                               <div class="methodsignature"><code>Window <strong>getCommandWindow</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns a reference to the window in which commands typed into the command line\r
+                                                                       are currently being executed.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandWindow</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandWindow</strong>(Window <em>commandWindow</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the window in which commands typed into the command line are executed.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getCommandLayout</div>\r
+                                                               <div class="methodsignature"><code>Number <strong>getCommandLayout</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the layout used to format the output for commands typed into the command line.\r
+                                                                       The default value is a <code><a href="#patternlayout">PatternLayout</a></code> with\r
+                                                                       pattern string <code>%m</code>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCommandLayout</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCommandLayout</strong>(Layout <em>commandLayout</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Sets the layout used to format the output for commands typed into the command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">clear</div>\r
+                                                               <div class="methodsignature"><code>void <strong>clear</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Clears all messages from the console window.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">show</div>\r
+                                                               <div class="methodsignature"><code>void <strong>show</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Shows / unhides the console window.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       In Safari (and possibly other browsers), hiding an <code>iframe</code>\r
+                                                                                       resets its document, thus destroying the console window.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">hide</div>\r
+                                                               <div class="methodsignature"><code>void <strong>hide</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Hides / minimizes the console window.\r
+                                                                       </p>\r
+                                                                       <p><strong>Notes</strong></p>\r
+                                                                       <ul>\r
+                                                                               <li>\r
+                                                                                       In Safari (and possibly other browsers), hiding an <code>iframe</code>\r
+                                                                                       resets its document, thus destroying the console window.\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">close</div>\r
+                                                               <div class="methodsignature"><code>void <strong>close</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Removes the console window iframe from the main document.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focus</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focus</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives it the focus.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focusCommandLine</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focusCommandLine</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives the focus to the command line.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">focusSearch</div>\r
+                                                               <div class="methodsignature"><code>void <strong>focusSearch</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Brings the console window to the top and gives the focus to the search box.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">evalCommandAndAppend</div>\r
+                                                               <div class="methodsignature"><code>void <strong>evalCommandAndAppend</strong>(String <em>expr</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Evaluates the expression and appends the result to the console.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">addCommandLineFunction</div>\r
+                                                               <div class="methodsignature"><code>void <strong>addCommandLineFunction</strong>(String <em>functionName</em>, Function <em>commandLineFunction</em>)</code></div>\r
+                                                               <div class="summary">\r
+                                                                       <p>\r
+                                                                               Adds a function with the name specified to the list of functions available on the command line.\r
+                                                                               This feature may be used to add custom functions to the command line.\r
+                                                                       </p>\r
+                                                                       <p>\r
+                                                                               When you call the function on the command line, <code>commandLineFunction</code> is executed with the\r
+                                                                               following three parameters:\r
+                                                                       </p>\r
+                                                                       <ul>\r
+                                                                               <li><em>appender</em>. A reference to the appender in which the command was executed;</li>\r
+                                                                               <li><em>args</em>.\r
+                                                                                       An array-like list of parameters passed into the function on the command line\r
+                                                                                       (actually a reference to an <code>arguments</code> object);</li>\r
+                                                                               <li><em>returnValue</em>. This is an object with two properties that allow the function to control\r
+                                                                                       how the result is displayed:\r
+                                                                                       <ul>\r
+                                                                                               <li><em>appendResult</em>. A boolean value that determines whether the returned value from this\r
+                                                                                                       function is appended to the console. The default value is <code>true</code>;</li>\r
+                                                                                               <li><em>isError</em>. A boolean value that specifies whether the output of this function\r
+                                                                                                       should be displayed as an error. The default value is <code>false</code>.</li>\r
+                                                                                       </ul>\r
+                                                                               </li>\r
+                                                                       </ul>\r
+                                                                       <p>\r
+                                                                               The value returned by the function is formatted by the command layout and appended to the console.\r
+                                                                       </p>\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="browserconsoleappender">\r
+                                               <h3>BrowserConsoleAppender</h3>\r
+                                               <p class="editions">Editions: <strong>Standardl</strong></p>\r
+                                               <p>\r
+                                                       Writes log messages to the browser's built-in console, if present. This only works\r
+                                                       currently in Safari, Opera and Firefox with the excellent\r
+                                                       <a href="http://www.getfirebug.com" title="Firebug home page (opens in new window)"\r
+                                                       target="_blank">Firebug</a> extension installed.\r
+                                               </p>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               As of log4javascript 1.3, the default threshold for this appender is <code>DEBUG</code>\r
+                                                               as opposed to <code>WARN</code> as it was previously;\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       As of version 1.3, log4javascript has explicit support for Firebug's logging. This includes\r
+                                                                       the following mapping of log4javascript's log levels onto Firebug's:\r
+                                                               </p>\r
+                                                               <ul>\r
+                                                                       <li>log4javascript <code>TRACE</code>, <code>DEBUG</code> -&gt; Firebug <code>debug</code></li>\r
+                                                                       <li>log4javascript <code>INFO</code> -&gt; Firebug <code>info</code></li>\r
+                                                                       <li>log4javascript <code>WARN</code> -&gt; Firebug <code>warn</code></li>\r
+                                                                       <li>log4javascript <code>ERROR</code>, <code>FATAL</code> -&gt; Firebug <code>error</code></li>\r
+                                                               </ul>\r
+                                                               <p>\r
+                                                                       ... and the ability to pass objects into Firebug and take advantage of its object inspection.\r
+                                                                       This is because the default layout is now <code><a href="#nulllayout">NullLayout</a></code>,\r
+                                                                       which performs no formatting on an object.\r
+                                                               </p>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">BrowserConsoleAppender</div>\r
+                                                               <div class="methodsignature"><code><strong>BrowserConsoleAppender</strong>()</code></div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                               </div>\r
+                               <div id="layouts">\r
+                                       <h2>Layouts</h2>\r
+                                       <div id="layout">\r
+                                               <h3>Layout</h3>\r
+                                               <p>\r
+                                                       There are a few methods common to all layouts:\r
+                                               </p>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">format</div>\r
+                                                               <div class="methodsignature"><code>String <strong>format</strong>(LoggingEvent <em>loggingEvent</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">loggingEvent</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Formats the log message. You should override this method in your own layouts.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">ignoresThrowable</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>ignoresThrowable</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the layout ignores an error object in a logging event passed\r
+                                                                       to its <code>format</code> method.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getContentType</div>\r
+                                                               <div class="methodsignature"><code>String <strong>getContentType</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns the content type of the output of the layout.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">allowBatching</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>allowBatching</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the layout's output is suitable for batching.\r
+                                                                       <code><a href="#jsonlayout">JsonLayout</a></code> and <code><a href="#xmllayout">XmlLayout</a></code>\r
+                                                                       are the only built-in layouts that return true for this method.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">getDataValues</div>\r
+                                                               <div class="methodsignature"><code>Array <strong>getDataValues</strong>(LoggingEvent <em>loggingEvent</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">loggingEvent</code>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Used internally by log4javascript in constructing formatted output for some layouts.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setKeys</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setKeys</strong>(String <em>loggerKey</em>,\r
+                                                                       String <em>timeStampKey</em>, String <em>levelKey</em>, String <em>messageKey</em>,\r
+                                                                       String <em>exceptionKey</em>, String <em>urlKey</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">loggerKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the log message's logger name. Default is <code>logger</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">timeStampKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the log message's timestamp.  Default is <code>timestamp</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">levelKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the log message's level. Default is <code>level</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">messageKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the message itself. Default is <code>message</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">exceptionKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the log message's error (exception). Default is <code>exception</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">urlKey</code>\r
+                                                                               <div>\r
+                                                                                       Parameter to use for the current page URL. Default is <code>url</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       This method is used to change the default keys used to create formatted name-value pairs\r
+                                                                       for the properties of a log message, for layouts that do this. These layouts are\r
+                                                                       <code><a href="#jsonlayout">JsonLayout</a></code> and\r
+                                                                       <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setCustomField</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setCustomField</strong>(String <em>name</em>,\r
+                                                                       String <em>value</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">name</code>\r
+                                                                               <div>\r
+                                                                                       Name of the custom property you wish to be included in the formmtted output.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">value</code>\r
+                                                                               <div>\r
+                                                                                       Value of the custom property you wish to be included in the formatted output.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Some layouts (<code><a href="#jsonlayout">JsonLayout</a></code>,\r
+                                                                       <code><a href="#httppostdatalayout">HttpPostDataLayout</a></code>,\r
+                                                                       <code><a href="#patternlayout">PatternLayout</a></code> and\r
+                                                                       <code><a href="#xmllayout">XmlLayout</a></code>) allow you to set\r
+                                                                       custom fields (e.g. a session id to send to the server) to the\r
+                                                                       formatted output. Use this method to set a custom field. If there\r
+                                                                       is already a custom field with the specified name, its value will\r
+                                                                       be updated with <code>value</code>.\r
+                                                               </div>\r
+                                                               <p><strong>Notes</strong></p>\r
+                                                               <ul>\r
+                                                                       <li>\r
+                                                                               <p>\r
+                                                                                       From version 1.4, the custom field value may be a function. In this\r
+                                                                                       case, the function is run at the time the layout's format method is called,\r
+                                                                                       with the following two parameters:\r
+                                                                               </p>\r
+                                                                               <ul>\r
+                                                                                       <li><em>layout</em>. A reference to the layout being used;</li>\r
+                                                                                       <li><em>loggingEvent</em>. A reference to the logging event being formatted.</li>\r
+                                                                               </ul>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">hasCustomFields</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>hasCustomFields</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether the layout has any custom fields.\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="nulllayout">\r
+                                               <h3>NullLayout</h3>\r
+                                               <p class="editions">Editions: <strong>All</strong></p>\r
+                                               <p>\r
+                                                       The most basic layout. NullLayout's <code>format()</code> methods performs no\r
+                                                       formatting at all and simply returns the message logged.\r
+                                               </p>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">NullLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>NullLayout</strong>()</code></div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="simplelayout">\r
+                                               <h3>SimpleLayout</h3>\r
+                                               <p class="editions">Editions: <strong>Standard, Production</strong></p>\r
+                                               <p>\r
+                                                       Provides basic formatting. SimpleLayout consists of the level of the log statement,\r
+                                                       followed by " - " and then the log message itself. For example,\r
+                                               </p>\r
+                                               <p><code>DEBUG - Hello world</code></p>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">SimpleLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>SimpleLayout</strong>()</code></div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="patternlayout">\r
+                                               <h3>PatternLayout</h3>\r
+                                               <p class="editions">Editions: <strong>All</strong></p>\r
+                                               <p>\r
+                                                       Provides a flexible way of formatting a log message by means of a conversion pattern\r
+                                                       string. The behaviour of this layout is a full implementation of <code>PatternLayout</code>\r
+                                                       in log4j, with the exception of the set of conversion characters - log4javascript's is\r
+                                                       necessarily a subset of that of log4j with a few additions of its own, since many of\r
+                                                       the conversion characters in log4j only make sense in the context of Java.\r
+                                               </p>\r
+                                               <p>\r
+                                                       The conversion pattern consists of literal text interspersed with special strings starting with\r
+                                                       a % symbol called <em>conversion specifiers</em>. A conversion specifier consists of the\r
+                                                       % symbol, a conversion character (possible characters are listed below) and\r
+                                                       <em>format modifiers</em>. For full documentation of the conversion pattern, see\r
+                                                       <a href="http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html" target="_blank">log4j's\r
+                                                       documentation</a>. Below is a list of all conversion characters available in log4javascript.\r
+                                               </p>\r
+                                               <h4>Conversion characters</h4>\r
+                                               <table border="1" cellspacing="0">\r
+                                                       <thead>\r
+                                                               <tr>\r
+                                                                       <th>Conversion Character</th>\r
+                                                                       <th>Effect</th>\r
+                                                               </tr>\r
+                                                       </thead>\r
+                                                       <tbody>\r
+                                                               <tr>\r
+                                                                       <td>a</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs log messages specified as an array.\r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       Behaves exactly like <code>%m</code>, except that multiple log messages are\r
+                                                                                       assumed to have been specified in the logging call as an array rather than\r
+                                                                                       as multiple parameters.\r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       <strong>Since: 1.4</strong>\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>c</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the logger name.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>d</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the date of the logging event. The date conversion specifier\r
+                                                                                       may be followed by a date format specifier enclosed between braces. For\r
+                                                                                       example, <code>%d{HH:mm:ss,SSS}</code> or\r
+                                                                                       <code>%d{dd MMM yyyy HH:mm:ss,SSS}</code>. If no date\r
+                                                                                       format specifier is given then ISO8601 format is assumed.\r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       The date format specifier is the same as that used by Java's\r
+                                                                                       <code><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"\r
+                                                                                               target="_blank">SimpleDateFormat</a></code>. log4javascript\r
+                                                                                       includes a full implementation of SimpleDateFormat's\r
+                                                                                       <code>format</code> method, with the exception of the pattern letter\r
+                                                                                       'z', (string representation of the timezone) for which the information\r
+                                                                                       is not available in JavaScript.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>f</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the value of a custom field set on the layout. If present, the specifier gives\r
+                                                                                       the index in the array of custom fields to use; otherwise, the first custom field in the\r
+                                                                                       array is used.\r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       <strong>Since: 1.3</strong>\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>m</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the log messages of the logging event (i.e. the log\r
+                                                                                       messages supplied by the client code).\r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       As of version 1.4, multiple log messages may be supplied to logging calls.\r
+                                                                                       <code>%m</code> displays each log message (using the rules below) one after\r
+                                                                                       another, separated by spaces. \r
+                                                                               </p>\r
+                                                                               <p>\r
+                                                                                       As of version 1.3, an object may be specified as the log message and will\r
+                                                                                       be expanded to show its properties in the output, provided that a specifier\r
+                                                                                       containing the number of levels to expand is provided. If no specifier is\r
+                                                                                       provided then the message will be treated as a string regardless of its type.\r
+                                                                                       For example, <code>%m{1}</code> will display an expansion of the object one\r
+                                                                                       level deep, i.e. each property of the object will be displayed but if the\r
+                                                                                       property value is itself an object it will not be expanded and will appear\r
+                                                                                       as <code>[object Object]</code>.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>n</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs a line separator.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>p</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the level of the logging event.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>r</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       Outputs the number of milliseconds since log4javascript was initialized.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td>%</td>\r
+                                                                       <td>\r
+                                                                               <p>\r
+                                                                                       The sequence %% outputs a single percent sign.\r
+                                                                               </p>\r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                       </tbody>\r
+                                               </table>\r
+                                               <h4>Static properties</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="property">\r
+                                                               <div class="name">TTCC_CONVERSION_PATTERN</div>\r
+                                                               <div class="summary">\r
+                                                                       Built-in conversion pattern, equivalent to <code>%r %p %c - %m%n</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="property">\r
+                                                               <div class="name">DEFAULT_CONVERSION_PATTERN</div>\r
+                                                               <div class="summary">\r
+                                                                       Built-in conversion pattern, equivalent to <code>%m%n</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="property">\r
+                                                               <div class="name">ISO8601_DATEFORMAT</div>\r
+                                                               <div class="summary">\r
+                                                                       Built-in date format (and also the default), equivalent to\r
+                                                                       <code>yyyy-MM-dd HH:mm:ss,SSS</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="property">\r
+                                                               <div class="name">DATETIME_DATEFORMAT</div>\r
+                                                               <div class="summary">\r
+                                                                       Built-in date format, equivalent to <code>dd MMM YYYY HH:mm:ss,SSS</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="property">\r
+                                                               <div class="name">ABSOLUTETIME_DATEFORMAT</div>\r
+                                                               <div class="summary">\r
+                                                                       Built-in date format, equivalent to <code>HH:mm:ss,SSS</code>.\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">PatternLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>PatternLayout</strong>(String <em>pattern</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">pattern</code>\r
+                                                                               <div>\r
+                                                                                       The conversion pattern string to use.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="xmllayout">\r
+                                               <h3>XmlLayout</h3>\r
+                                               <p class="editions">Editions: <strong>Standard, Production</strong></p>\r
+                                               <p>\r
+                                                       Based on log4j's <code>XmlLayout</code>, this layout formats a log message as a\r
+                                                       fragment of XML. An example of the format of the fragment is as follows:\r
+                                               </p>\r
+                                               <pre>\r
+&lt;log4javascript:event logger="[default]" timestamp="1201048234203" level="ERROR"&gt;\r
+&lt;log4javascript:message&gt;&lt;![CDATA[Big problem!]]&gt;&lt;/log4javascript:message&gt;\r
+&lt;log4javascript:exception&gt;&lt;![CDATA[Nasty error on line number 1\r
+       in file http://log4javascript.org/test.html]]&gt;&lt;/log4javascript:exception&gt;\r
+&lt;/log4javascript:event&gt;\r
+</pre>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               This layout supports batching of log messages when used in an\r
+                                                               <code><a href="#ajaxappender">AjaxAppender</a></code>. A batch of\r
+                                                               messages is simply concatenated to form a string of several XML\r
+                                                               frgaments similar to that above.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               The <code>&lt;log4javascript:exception&gt;</code> element is only present if an\r
+                                                               exception was passed into the original log call.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               As of version 1.4, timestamps are returned as milliseconds since midnight of\r
+                                                               January 1, 1970 rather than seconds as in previous versions. This allows finer\r
+                                                               measurement of the time a logging event occurred and is also the JavaScript\r
+                                                               <code>Date</code> object's standard measurement.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               Also as of version 1.4, multiple messages may be specified as separate parameters\r
+                                                               in a single logging call. In <code>XmlLayout</code>, multiple messages may be\r
+                                                               formatted as a single combined message or may be formated as several\r
+                                                               <code>&lt;log4javascript:message&gt;</code> elements inside one\r
+                                                               <code>&lt;log4javascript:messages&gt;</code> element as shown below:\r
+                                                               <br />\r
+                                                               <pre>\r
+&lt;log4javascript:event logger="[default]" timestamp="1201048234203" level="ERROR"&gt;\r
+&lt;log4javascript:messages&gt;\r
+       &lt;log4javascript:message&gt;&lt;![CDATA[Big problem!]]&gt;&lt;/log4javascript:message&gt;\r
+       &lt;log4javascript:message&gt;&lt;![CDATA[Value of x when this error\r
+               occurred: 3]]&gt;&lt;/log4javascript:message&gt;\r
+&lt;/log4javascript:messages&gt;\r
+&lt;log4javascript:exception&gt;&lt;![CDATA[Nasty error on line number 1\r
+       in file http://log4javascript.org/test.html]]&gt;&lt;/log4javascript:exception&gt;\r
+&lt;/log4javascript:event&gt;\r
+</pre>\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               As of version 1.3, custom fields may be added to the output. Each field will\r
+                                                               add a tag of the following form inside the <code>&lt;log4javascript:event&gt;</code>\r
+                                                               tag:\r
+                                                               <br />\r
+                                                               <pre>\r
+&lt;log4javascript:customfield name="sessionid"&gt;&lt;![CDATA[1234]]&gt;&lt;/log4javascript:customfield&gt;\r
+</pre>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">XmlLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>XmlLayout</strong>([Boolean <em>combineMessages</em>])</code></div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">combineMessages</code>\r
+                                                                               <div>\r
+                                                                                       Whether or not to format multiple log messages as a combined single\r
+                                                                                       <code>&lt;log4javascript:message&gt;</code> element\r
+                                                                                       composed of each individual message separated by line breaks or to include\r
+                                                                                       a <code>&lt;log4javascript:message&gt;</code> element for each message inside\r
+                                                                                       one <code>&lt;log4javascript:messages&gt;</code> element.\r
+                                                                                       If not specified, defaults to <code>true</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                                       <div id="jsonlayout">\r
+                                               <h3>JsonLayout</h3>\r
+                                               <p class="editions">Editions: <strong>Standard, Production</strong></p>\r
+                                               <p>\r
+                                                       Formats a logging event into JavaScript Object Notation (JSON).\r
+                                                       JSON is a subset of JavaScript's object literal syntax, meaning that log\r
+                                                       messages formatted with this layout can be interpreted directly by JavaScript\r
+                                                       and converted into objects. See\r
+                                                       <a href="http://json.org/" target="_blank" title="json.org (opens in new window)">json.org</a> for more details\r
+                                                       about JSON.\r
+                                               </p>\r
+                                               <p>Example:</p>\r
+                                               <pre>\r
+{\r
+       "logger": "[default]",\r
+       "timeStamp": 1201048234203,\r
+       "level": "ERROR",\r
+       "url": "http://log4javascript.org/test.html",\r
+       "message": "Big problem!",\r
+       "exception": "Nasty error on line number 1 in file\r
+               http://log4javascript.org/test.html"\r
+}\r
+</pre>\r
+                                               <p>\r
+                                                       The <code>exception</code> property is only present if an exception was passed\r
+                                                       into the original log call.\r
+                                               </p>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               This layout supports batching of log messages when used in an\r
+                                                               <code><a href="#ajaxappender">AjaxAppender</a></code>. When sent singly\r
+                                                               the layout formats the log message as a single JavaScript object literal;\r
+                                                               when sent as a batch, the messages are formatted as an array literal whose\r
+                                                               elements are log message objects.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       As of version 1.3, custom fields may be added to the output. Each field will\r
+                                                                       add a property of the following form to the main object literal:\r
+                                                               </p>\r
+                                                               <pre>\r
+       "sessionid": 1234\r
+</pre>\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               From version 1.4, the variable names used for log event properties such as\r
+                                                               the message, timestamp and exception are specified using the <code>setKeys()</code>\r
+                                                               method of <code><a href="#layout">Layout</a></code>.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               <p>\r
+                                                                       Also as of version 1.4, multiple messages may be specified as separate parameters\r
+                                                                       in a single logging call. In <code>JsonLayout</code>, multiple messages may be\r
+                                                                       formatted as a single combined message or may be formated as an array of messages\r
+                                                                       as shown below:\r
+                                                               </p>\r
+                                                               <pre>\r
+{\r
+       "logger": "[default]",\r
+       "timeStamp": 1201048234203,\r
+       "level": "ERROR",\r
+       "url": "http://log4javascript.org/test.html",\r
+       "message": [\r
+               "Big problem!",\r
+               "Value of x when this error occurred: 3"\r
+       ],\r
+       "exception": "Nasty error on line number 1 in file\r
+               http://log4javascript.org/test.html"\r
+}\r
+</pre>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">JsonLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>JsonLayout</strong>([Boolean <em>readable</em>, Boolean <em>combineMessages</em>])</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">readable</code>\r
+                                                                               <div>\r
+                                                                                       Whether or not to format each log message with line breaks and tabs.\r
+                                                                                       If not specified, defaults to <code>false</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">combineMessages</code>\r
+                                                                               <div>\r
+                                                                                       Whether or not to format multiple log messages as a combined single\r
+                                                                                       <code>message</code> property composed of each individual message separated by line\r
+                                                                                       breaks or to format multiple messages as an array.\r
+                                                                                       If not specified, defaults to <code>true</code>.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">isReadable</div>\r
+                                                               <div class="methodsignature"><code>Boolean <strong>isReadable</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Returns whether or not to each log message is formatted with line breaks and tabs.\r
+                                                               </div>\r
+                                                               <p><strong>Notes</strong></p>\r
+                                                               <ul>\r
+                                                                       <li>\r
+                                                                               <p>\r
+                                                                                       <code>setReadable</code> has been removed in version 1.4. This property can\r
+                                                                                       be set via the constructor.\r
+                                                                               </p>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                       </li>\r
+                                               </ul>\r
+                                       </div>\r
+                                       <div id="httppostdatalayout">\r
+                                               <h3>HttpPostDataLayout</h3>\r
+                                               <p class="editions">Editions: <strong>Standard, Production</strong></p>\r
+                                               <p>\r
+                                                       Formats the log message as a simple URL-encoded string from which a simple\r
+                                                       server-side script may extract parameters such as the log message, severity\r
+                                                       and timestamp. This is the default layout for\r
+                                                       <code><a href="#ajaxappender">AjaxAppender</a></code>.\r
+                                               </p>\r
+                                               <h4>Constructor</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">HttpPostDataLayout</div>\r
+                                                               <div class="methodsignature"><code><strong>HttpPostDataLayout</strong>()</code></div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p><strong>Notes</strong></p>\r
+                                               <ul>\r
+                                                       <li>\r
+                                                               As of version 1.3, custom fields may be added to the output. Each field will\r
+                                                               be added as a parameter to the post data.\r
+                                                       </li>\r
+                                                       <li>\r
+                                                               From version 1.4, the variable names used for log event properties such as\r
+                                                               the message, timestamp and exception are specified using the <code>setKeys()</code>\r
+                                                               method of <code><a href="#layout">Layout</a></code>.\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                               </div>\r
+                               <div id="enabling">\r
+                                       <h2>Enabling / disabling log4javascript</h2>\r
+                                       <p>\r
+                                               All logging can be enabled or disabled in log4javascript in a number of ways:\r
+                                       </p>\r
+                                       <ul>\r
+                                               <li>\r
+                                                       At any time, you can call\r
+                                                       <code>log4javascript.setEnabled(<em>enabled</em>)</code>. This will\r
+                                                       enable or disable all logging, depending on whether <code>enabled</code>\r
+                                                       is set to <code>true</code> or <code>false</code>.\r
+                                               </li>\r
+                                               <li>\r
+                                                       <p>\r
+                                                               Assign a value to the global variable <code>log4javascript_disabled</code>.\r
+                                                               The idea of this is so that you can enable or disable logging for a whole site by\r
+                                                               including a JavaScript file in all your pages, and allowing this file to be\r
+                                                               included <strong>before</strong> log4javascript.js to guarantee that no logging\r
+                                                               can take place without having to alter log4javascript.js itself. Your included\r
+                                                               .js file would include a single line such as the following:\r
+                                                       </p>\r
+                                                       <p>\r
+                                                               <code>var log4javascript_disabled = true;</code>\r
+                                                       </p>\r
+                                               </li>\r
+                                               <li>\r
+                                                       Assign your logger object a value of <code>log4javascript.getNullLogger()</code>.\r
+                                               </li>\r
+                                               <li>\r
+                                                       Replace your copy of log4javascript_x.js with stubs/log4javascript_x.js, provided in the\r
+                                                       distribution. This file has a stub version of each of the functions and methods\r
+                                                       in the log4javascript API and can simply be dropped in in place of the main file.\r
+                                                       The compressed version of the stub is typically 15 times smaller than the\r
+                                                       compressed version of the main file.\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="errorhandling">\r
+                                       <h2>log4javascript error handling</h2>\r
+                                       <p>\r
+                                               log4javascript has a single rudimentary logger-like object of its own to handle\r
+                                               messages generated by log4javascript itself. This logger is called <code>LogLog</code>\r
+                                               and is accessed via <code>log4javascript.logLog</code>.\r
+                                       </p>\r
+                                       <div id="loglog">\r
+                                               <h4>Methods</h4>\r
+                                               <ul class="propertieslist">\r
+                                                       <li class="method">\r
+                                                               <div class="name">setQuietMode</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setQuietMode</strong>(Boolean <em>quietMode</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">quietMode</code>\r
+                                                                               <div>\r
+                                                                                       Whether to turn quiet mode on or off.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Sets whether <code>LogLog</code> is in quiet mode or not. In quiet mode, no\r
+                                                                       messages sent to <code>LogLog</code> have any visible effect. By default,\r
+                                                                       quiet mode is switched off.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">setAlertAllErrors</div>\r
+                                                               <div class="methodsignature"><code>void <strong>setAlertAllErrors</strong>(Boolean <em>alertAllErrors</em>)</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">showAllErrors</code>\r
+                                                                               <div>\r
+                                                                                       Whether to show all errors or just the first.\r
+                                                                               </div>\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Sets how many errors <code>LogLog</code> will display alerts for. By default,\r
+                                                                       only the first error encountered generates an alert to the user. If you turn\r
+                                                                       all errors on by supplying <code>true</code> to this method then all errors\r
+                                                                       will generate alerts.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">debug</div>\r
+                                                               <div class="methodsignature"><code>void <strong>debug</strong>(String <em>message</em>[, Error <em>exception</em>])</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">message</code>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">exception</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Logs a debugging message to an in-memory list. This implementation is new in version 1.4.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">displayDebug</div>\r
+                                                               <div class="methodsignature"><code>void <strong>displayDebug</strong>()</code></div>\r
+                                                               <div class="summary">\r
+                                                                       Displays an alert of all debugging messages. This method is new in version 1.4.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">warn</div>\r
+                                                               <div class="methodsignature"><code>void <strong>warn</strong>(String <em>message</em>[, Error <em>exception</em>])</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">message</code>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">exception</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Currently has no effect.\r
+                                                               </div>\r
+                                                       </li>\r
+                                                       <li class="method">\r
+                                                               <div class="name">error</div>\r
+                                                               <div class="methodsignature"><code>void <strong>error</strong>(String <em>message</em>[, Error <em>exception</em>])</code></div>\r
+                                                               <div class="paramsheading">Parameters:</div>\r
+                                                               <ul class="params">\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">message</code>\r
+                                                                       </li>\r
+                                                                       <li class="param">\r
+                                                                               <code class="paramname">exception</code>\r
+                                                                               [<em>optional</em>]\r
+                                                                       </li>\r
+                                                               </ul>\r
+                                                               <div class="summary">\r
+                                                                       Generates an alert to the user if and only if the error is the first one\r
+                                                                       encountered and <code>setAlertAllErrors(true)</code> has not been called.\r
+                                                               </div>\r
+                                                       </li>\r
+                                               </ul>\r
+                                               <p class="linktotop">\r
+                                                       <a href="#container">Top</a>\r
+                                               </p>\r
+                                       </div>\r
+                               </div>\r
+                               <div id="differences">\r
+                                       <h2>Differences between log4javascript and log4j</h2>\r
+                                       <p>\r
+                                               For the sake of keeping log4javascript as light and useful as possible, many\r
+                                               of the features of log4j that seem over-complex or inappropriate for\r
+                                               JavaScript have not been implemented. These include:\r
+                                       </p>\r
+                                       <ul>\r
+                                               <li>Filters</li>\r
+                                               <li>Configurators</li>\r
+                                               <li>Renderers</li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/manual_lite.html b/planetstack/core/static/log4javascript-1.4.6/docs/manual_lite.html
new file mode 100644 (file)
index 0000000..74e5a7d
--- /dev/null
@@ -0,0 +1,383 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript 1.4 Lite manual</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript 1.4 Lite manual</h1>\r
+                               <h2>Contents</h2>\r
+                               <ul>\r
+                                       <li><a href="#intro">Introduction</a></li>\r
+                                       <li><a href="#log4javascript">log4javascript static properties/methods</a></li>\r
+                                       <li><a href="#levels">Levels</a></li>\r
+                                       <li><a href="#loggers">Loggers</a></li>\r
+                                       <li><a href="#enabling">Enabling / disabling log4javascript Lite</a></li>\r
+                               </ul>\r
+                               <div id="intro">\r
+                                       <h2>Introduction</h2>\r
+                                       <p>\r
+                                               log4javascript Lite is designed to be a basic, lightweight, cross-browser logging tool. It\r
+                                               provides functions to log messages of different severity to a pop-up window using the exactly\r
+                                               the same syntax as log4javascript. It is designed for situations when the key requirement is just\r
+                                               to display logging messages without needing all the features of the standard version of\r
+                                               log4javascript. \r
+                                       </p>\r
+                                       <p>\r
+                                               Below is the complete list of functions and properties available in log4javascript Lite.\r
+                                               They make up a small subset of those provided by the standard version of\r
+                                               log4javascript. Each function is <strong>named and called identically to the equivalent\r
+                                               function in log4javascript</strong>. Please refer to the\r
+                                               <a href="manual.html">log4javascript manual</a> for a detailed explanation\r
+                                               of all the concepts alluded to in this document.\r
+                                       </p>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="log4javascript">\r
+                                       <h2>log4javascript static properties/methods</h2>\r
+                                       <h4>Properties</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="property">\r
+                                                       <div class="name">version</div>\r
+                                                       <div class="summary">\r
+                                                               The version number of your copy of log4javascript.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="property">\r
+                                                       <div class="name">edition</div>\r
+                                                       <div class="summary">\r
+                                                               The edition of your copy of log4javascript ("log4javascript_lite" in this case").\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <h4>Methods</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="method">\r
+                                                       <div class="name">getDefaultLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getDefaultLogger</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns the default and only logger (apart from the null logger). The default logger\r
+                                                               logs to a simple pop-up window.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getNullLogger</div>\r
+                                                       <div class="methodsignature"><code>Logger <strong>getNullLogger</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns an empty logger. Useful for disabling all logging.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setEnabled</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setEnabled</strong>(Boolean <em>enabled</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">enabled</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Enables or disables all logging, depending on <code>enabled</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns true or false depending on whether logging is enabled.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">setShowStackTraces</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setShowStackTraces</strong>(Boolean <em>show</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">show</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Enables or disables displaying of error stack traces, depending on <code>show</code>.\r
+                                                               By default, stack traces are not displayed. (Only works in Firefox)\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="levels">\r
+                                       <h2>Levels</h2>\r
+                                       <p>\r
+                                               Levels are available as static properties of the <code>log4javascript.Level</code>\r
+                                               object. In ascending order of severity:\r
+                                       </p>\r
+                                       <ol>\r
+                                               <li><code>log4javascript.Level.ALL</code></li>\r
+                                               <li><code>log4javascript.Level.TRACE</code></li>\r
+                                               <li><code>log4javascript.Level.DEBUG</code></li>\r
+                                               <li><code>log4javascript.Level.INFO</code></li>\r
+                                               <li><code>log4javascript.Level.WARN</code></li>\r
+                                               <li><code>log4javascript.Level.ERROR</code></li>\r
+                                               <li><code>log4javascript.Level.FATAL</code></li>\r
+                                               <li><code>log4javascript.Level.NONE</code></li>\r
+                                       </ol>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="loggers">\r
+                                       <h2>Loggers</h2>\r
+                                       <p>\r
+                                               There are only two loggers in log4javascript Lite: the default logger obtained\r
+                                               by calling <code>log4javascript.getDefaultLogger()</code> and the empty logger\r
+                                               returned by <code>log4javascript.getNullLogger()</code>.\r
+                                       </p>\r
+                                       <h4>Logger methods</h4>\r
+                                       <ul class="propertieslist">\r
+                                               <li class="method">\r
+                                                       <div class="name">setLevel</div>\r
+                                                       <div class="methodsignature"><code>void <strong>setLevel</strong>(Level <em>level</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Sets the level. Log messages of a lower level than <code>level</code> will not be logged.\r
+                                                               Default value is <code>ALL</code> (unlike in log4javascript, where the default level is\r
+                                                               <code>DEBUG</code>).\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">getLevel</div>\r
+                                                       <div class="methodsignature"><code>Level <strong>getLevel</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns the level for this logger.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">trace</div>\r
+                                                       <div class="methodsignature"><code>void <strong>trace</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>TRACE</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">debug</div>\r
+                                                       <div class="methodsignature"><code>void <strong>debug</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>DEBUG</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">info</div>\r
+                                                       <div class="methodsignature"><code>void <strong>info</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>INFO</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">warn</div>\r
+                                                       <div class="methodsignature"><code>void <strong>warn</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>WARN</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">error</div>\r
+                                                       <div class="methodsignature"><code>void <strong>error</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>ERROR</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">fatal</div>\r
+                                                       <div class="methodsignature"><code>void <strong>fatal</strong>(Object <em>message1</em>[, Object <em>message2</em>, ... ][, Error <em>exception</em>])</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">message1[, message2...]</code>\r
+                                                               </li>\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">exception</code>\r
+                                                                       [<em>optional</em>]\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Logs one or more messages and optionally an error at level <code>FATAL</code>.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isEnabledFor</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isEnabledFor</strong>(Level <em>level</em>, Error <em>exception</em>)</code></div>\r
+                                                       <div class="paramsheading">Parameters:</div>\r
+                                                       <ul class="params">\r
+                                                               <li class="param">\r
+                                                                       <code class="paramname">level</code>\r
+                                                               </li>\r
+                                                       </ul>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for the specified level. \r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isTraceEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isTraceEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>TRACE</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isDebugEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isDebugEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>DEBUG</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isInfoEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isInfoEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>INFO</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isWarnEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isWarnEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>WARN</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isErrorEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isErrorEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>ERROR</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                               <li class="method">\r
+                                                       <div class="name">isFatalEnabled</div>\r
+                                                       <div class="methodsignature"><code>Boolean <strong>isFatalEnabled</strong>()</code></div>\r
+                                                       <div class="summary">\r
+                                                               Returns whether the logger is enabled for <code>FATAL</code> messages.\r
+                                                       </div>\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                               <div id="enabling">\r
+                                       <h2>Enabling / disabling log4javascript Lite</h2>\r
+                                       <p>\r
+                                               All logging can be enabled or disabled in log4javascript Lite in a number of ways:\r
+                                       </p>\r
+                                       <ul>\r
+                                               <li>\r
+                                                       At any time, you can call\r
+                                                       <code>log4javascript.setEnabled(<em>enabled</em>)</code>. This will\r
+                                                       enable or disable all logging, depending on whether <code>enabled</code>\r
+                                                       is set to <code>true</code> or <code>false</code>.\r
+                                               </li>\r
+                                               <li>\r
+                                                       Assign your logger object a value of <code>log4javascript.getNullLogger()</code>.\r
+                                               </li>\r
+                                               <li>\r
+                                                       Replace your copy of log4javascript_lite.js with stubs/log4javascript_lite.js, provided in the\r
+                                                       distribution. This file has a stub version of each of the functions and methods\r
+                                                       in the log4javascript Lite API and can simply be dropped in in place of the main file.\r
+                                               </li>\r
+                                       </ul>\r
+                                       <p class="linktotop">\r
+                                               <a href="#container">Top</a>\r
+                                       </p>\r
+                               </div>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/quickstart.html b/planetstack/core/static/log4javascript-1.4.6/docs/quickstart.html
new file mode 100644 (file)
index 0000000..3bffff5
--- /dev/null
@@ -0,0 +1,230 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript quick start tutorial</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <span class="navitem">quick start</span>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript quick start tutorial</h1>\r
+                               <h2>Three step guide</h2>\r
+                               <ol>\r
+                                       <li>\r
+                                               <h3>Download the code</h3>\r
+                                               <p>\r
+                                                       Unzip the distribution and copy log4javascript.js into the desired\r
+                                                       location. No other files are necessary.\r
+                                               </p>\r
+                                       </li>\r
+                                       <li>\r
+                                               <h3>Initialize log4javascript in your web page</h3>\r
+                                               <p>\r
+                                                       Include log4javascript.js in your page using the code below. This\r
+                                                       code assumes log4javascript is stored in the same directory as\r
+                                                       your web page.\r
+                                               </p>\r
+                                               <pre class="code">\r
+&lt;script type="text/javascript" src="log4javascript.js"&gt;&lt;/script&gt;\r
+&lt;script type="text/javascript"&gt;\r
+       var log = log4javascript.getDefaultLogger();\r
+&lt;/script&gt;\r
+</pre>\r
+                                               <p>\r
+                                                       The default logger uses a <code><a href="manual.html#popupappender">PopUpAppender</a></code>\r
+                                                       which opens a pop-up window. By default, this window will open when the first\r
+                                                       log message is written. For this to work, you will need to disable any pop-up blockers\r
+                                                       you may have.\r
+                                               </p>\r
+                                       </li>\r
+                                       <li>\r
+                                               <h3>Include logging statements in your code</h3>\r
+                                               <p>\r
+                                                       You have six logging methods at your disposal, depending on the severity\r
+                                                       of the message you wish to log. By default, all messages are logged\r
+                                                       in the pop-up window. The logging methods are:\r
+                                               </p>\r
+                                               <ul>\r
+                                                       <li><code>log.trace(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                                       <li><code>log.debug(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                                       <li><code>log.info(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                                       <li><code>log.warn(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                                       <li><code>log.error(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                                       <li><code>log.fatal(<em>message</em>[, <em>message2</em>, ... ][, <em>exception</em>])</code></li>\r
+                                               </ul>\r
+                                               <p>\r
+                                                       And that's it, log away. Below are some examples of common types of logging.\r
+                                               </p>\r
+                                       </li>\r
+                               </ol>\r
+                               <h2>Logging examples</h2>\r
+                               <ol>\r
+                                       <li>\r
+                                               <h3>A simple logging message string</h3>\r
+                                               <pre class="code">\r
+       log.info("Hello world");\r
+</pre>\r
+displays\r
+                                               <pre class="console info">\r
+19:52:03 INFO  - Hello world\r
+</pre>\r
+                                       </li>\r
+                                       <li>\r
+                                               <h3>Logging an error with a message</h3>\r
+                                               <pre class="code">\r
+       try {\r
+               throw new Error("Faking something going wrong!");\r
+       } catch (e) {\r
+               log.error("An error occurred", e);\r
+       }\r
+</pre>\r
+displays\r
+                                               <pre class="console error">\r
+19:52:32 ERROR - An error occurred\r
+Exception: Faking something going wrong! on line number 80 in file basic.html\r
+</pre>\r
+                                       </li>\r
+                                       <li>\r
+                                               <h3>Logging multiple messages with one logging call</h3>\r
+                                               <pre class="code">\r
+       var a = "Hello";\r
+       var b = 3;\r
+       log.debug(a, b);\r
+</pre>\r
+displays\r
+                                               <pre class="console debug">\r
+19:53:05 DEBUG  - Hello 3\r
+</pre>\r
+                                       </li>\r
+                                       <li>\r
+                                               <h3>Logging an object</h3>\r
+                                               <p>Logging an object:</p>\r
+                                               <pre class="code">\r
+       var obj = new Object();\r
+       obj.name = "Octopus";\r
+       obj.tentacles = 8;\r
+       log.info(obj);\r
+</pre>\r
+displays\r
+                                               <pre class="console info">\r
+19:53:17 INFO  - {\r
+       name: Octopus,\r
+       tentacles: 8\r
+}\r
+</pre>\r
+                                       </li>\r
+                               </ol>\r
+                               <h2>Tweaking the default logger</h2>\r
+                               <p>\r
+                                       The default logger is fine as a starting point, but what if you want the default logger\r
+                                       with a few different options (say, bringing the pop-up to the front whenever a log message is\r
+                                       logged, or having new log messages appear at the top of the pop-up rather than the bottom)?\r
+                               </p>\r
+                               <p>\r
+                                       In this case, you will need to create a new logger, then create a\r
+                                       <code><a href="manual.html#popupappender">PopUpAppender</a></code>, set options\r
+                                       on it, and add it to the logger:\r
+                               </p>\r
+                               <pre class="code">\r
+&lt;script type="text/javascript" src="log4javascript.js"&gt;&lt;/script&gt;\r
+&lt;script type="text/javascript"&gt;\r
+       // Create the logger\r
+       var log = log4javascript.getLogger();\r
+\r
+       // Create a PopUpAppender with default options\r
+       var popUpAppender = new log4javascript.PopUpAppender();\r
+\r
+       // Change the desired configuration options\r
+       popUpAppender.setFocusPopUp(true);\r
+       popUpAppender.setNewestMessageAtTop(true);\r
+\r
+       // Add the appender to the logger\r
+       log.addAppender(popUpAppender);\r
+\r
+       // Test the logger\r
+       log.debug("Hello world!");\r
+&lt;/script&gt;\r
+</pre>\r
+                               <p>\r
+                                       <a href="../examples/example_quickstart_1.html" title="View example (opens in new window)"\r
+                                               target="_blank">See this example in action</a> (opens in new window)\r
+                               </p>\r
+                               <p>\r
+                                       Refer to the manual for more information about\r
+                                       <a href="manual.html#configuration">configuring appenders</a> and more\r
+                                       details about <code><a href="manual.html#popupappender">PopUpAppender</a></code>.\r
+                               </p>\r
+                               <h2>Sending log messages to the server</h2>\r
+                               <p>\r
+                                       For this you will need to use an <code><a href="manual.html#ajaxappender">AjaxAppender</a></code>\r
+                                       as follows:\r
+                               </p>\r
+                               <pre class="code">\r
+       var ajaxAppender = new log4javascript.AjaxAppender(<em>URL</em>);\r
+       log.addAppender(ajaxAppender);\r
+</pre>\r
+                               <p>\r
+                                       Now your log messages will appear in the pop-up window and be sent\r
+                                       asynchronously to the URL you specify in the form of HTTP post parameters.\r
+                                       No server-side code to process these requests is provided with log4javascript.\r
+                               </p>\r
+                               <p>\r
+                                       See <code><a href="manual.html#ajaxappender">AjaxAppender</a></code> for more details\r
+                                       on formatting log messages.\r
+                               </p>\r
+                               <h2>Changing the format of log messages</h2>\r
+                               <p>\r
+                                       Using a <code><a href="manual.html#layouts">Layout</a></code>, you can\r
+                                       format log messages however you like. For example:\r
+                               </p>\r
+                               <pre class="code">\r
+       var log = log4javascript.getLogger("mylogger");\r
+       var popUpAppender = new log4javascript.PopUpAppender();\r
+       var layout = new log4javascript.PatternLayout("[%-5p] %m");\r
+       popUpAppender.setLayout(layout);\r
+</pre>\r
+                               <p>A call to</p>\r
+                               <pre class="code">\r
+       log.debug("Hello world");\r
+</pre>\r
+                               <p>will now result in output in the pop-up window of </p>\r
+                               <pre class="console debug">\r
+[DEBUG] Hello world\r
+</pre>\r
+                               <p>\r
+                                       See <code><a href="manual.html#patternlayout">PatternLayout</a></code> for more details\r
+                                       on formatting log messages.\r
+                               </p>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/docs/whatsnew.html b/planetstack/core/static/log4javascript-1.4.6/docs/whatsnew.html
new file mode 100644 (file)
index 0000000..6e4e06f
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - what's new in version 1.4</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <link rel="stylesheet" type="text/css" media="screen,print" href="../main.css" title="Default" />\r
+       </head>\r
+       <body>\r
+               <div id="container" class="nonav">\r
+                       <div id="header">\r
+                               <h1><a href="index.html">log4javascript</a></h1>\r
+                       </div>\r
+                       <div id="content">\r
+                               <div id="nav">\r
+                                       <a class="navitem" href="../index.html">home</a>\r
+                                       | <a class="navitem" href="http://sourceforge.net/projects/log4javascript" target="_blank" title="Download (opens in new window)">download</a>\r
+                                       | <a class="navitem" href="index.html">docs</a>\r
+                                       | <a class="navitem" href="quickstart.html">quick start</a>\r
+                                       | <a class="navitem" href="../demos/index.html">demos</a>\r
+                                       | <a class="navitem" href="http://log4javascript.org" target="_blank">website</a>\r
+                                       | <a class="navitem" href="http://www.timdown.co.uk" target="_blank">timdown.co.uk</a>\r
+                               </div>\r
+                               <h1>log4javascript - what's new in version 1.4</h1>\r
+                               <ul>\r
+                                       <li>\r
+                                               log4javascript now comes in three different editions: Standard, Production\r
+                                               and Lite. <a href="distribution.html">Full details here</a>.\r
+                                       </li>\r
+                                       <li>\r
+                                               Loggers are now hierarchical and work exactly the same as log4j loggers.\r
+                                               This means that a logger with no level set on it inherits its level from its parent,\r
+                                               and inherits all of its parents appenders.\r
+                                       </li>\r
+                                       <li>\r
+                                               The logging console used by <code><a href="manual.html#popupappender">PopUpAppender</a></code> and\r
+                                               <code><a href="manual.html#inpageappender">InPageAppender</a></code>now has a command line, featuring\r
+                                               a command history navigated with the up and down arrow keys and a number of built-in command line\r
+                                               functions.\r
+                                       </li>\r
+                                       <li>\r
+                                               It is now possible to specify multiple messages in a single log call.\r
+                                       </li>\r
+                                       <li>\r
+                                               Log messages may be grouped in the logging console.\r
+                                       </li>\r
+                                       <li>\r
+                                               Built-in timers.\r
+                                       </li>\r
+                                       <li>\r
+                                               Improved <code><a href="manual.html#ajaxappender">AjaxAppender</a></code>, with the ability\r
+                                               to send all pending log calls to the server when navigating away from a page. Timestamps now\r
+                                               include milliseconds. All log messages or batches of log messages are now posted as\r
+                                               name-value pairs.\r
+                                       </li>\r
+                                       <li>\r
+                                               Support for IE8 beta 2.\r
+                                       </li>\r
+                                       <li>\r
+                                               Many minor enhancements and bug fixes. See the <a href="../changelog.txt">change log</a> for full\r
+                                               details.\r
+                                       </li>\r
+                               </ul>\r
+                               <p>\r
+                                       Please note that there are a few minor <a href="backwardsincompatibilities.html">incompatibilities\r
+                                       with earlier versions of log4javascript</a>.\r
+                               </p>\r
+                       </div>\r
+                       <div id="footer">\r
+                               <span class="externallinkinfo">\r
+                                       <strong>NB.</strong> All external links open in a new window.\r
+                               </span>\r
+                               Written by Tim Down. <a href="mailto:tim@log4javascript.org">tim@log4javascript.org</a>\r
+                               <br />\r
+                               log4javascript is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html"\r
+                                       title="Apache License, Version 2.0 (opens in new window)" target="_blank">Apache License,\r
+                                       Version 2.0</a>\r
+\r
+                       </div>\r
+               </div>\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/examples/demo.html b/planetstack/core/static/log4javascript-1.4.6/examples/demo.html
new file mode 100644 (file)
index 0000000..118b879
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript demo redirect</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="noindex" />\r
+               <meta http-equiv="refresh" content="0; url=../demos/basic.html" />\r
+       </head>\r
+       <body>\r
+               This page has been replaced by <a href="/demos/basic.html">the basic demo page</a>.\r
+               Please use this link if you are not redirected automatically.\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/examples/example_manual.html b/planetstack/core/static/log4javascript-1.4.6/examples/example_manual.html
new file mode 100644 (file)
index 0000000..68189e3
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript example from  manual</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <script type="text/javascript" src="../js/log4javascript.js"></script>\r
+               <script type="text/javascript">\r
+                       //<![CDATA[\r
+                       var log = log4javascript.getLogger();\r
+                       var popUpAppender = new log4javascript.PopUpAppender();\r
+                       var popUpLayout = new log4javascript.PatternLayout("%d{HH:mm:ss} %-5p - %m%n");\r
+                       popUpAppender.setLayout(popUpLayout);\r
+                       log.addAppender(popUpAppender);\r
+                       var ajaxAppender = new log4javascript.AjaxAppender("myloggingservlet.do");\r
+                       ajaxAppender.setThreshold(log4javascript.Level.ERROR);\r
+                       log.addAppender(ajaxAppender);\r
+                       log.debug("Debugging message (appears in pop-up)");\r
+                       log.error("Error message (appears in pop-up and in server log)");\r
+                       //]]>\r
+               </script>\r
+       </head>\r
+       <body>\r
+               <h1>log4javascript example from  manual</h1>\r
+\r
+\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/examples/example_quickstart_1.html b/planetstack/core/static/log4javascript-1.4.6/examples/example_quickstart_1.html
new file mode 100644 (file)
index 0000000..3ae4a9f
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript quick start example 1</title>\r
+               <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
+               <meta name="author" content="Tim Down - tim@log4javascript.org" />\r
+               <meta name="description" content="log4javascript, a logging framework for JavaScript based on log4j" />\r
+               <meta name="robots" content="all" />\r
+               <script type="text/javascript" src="../js/log4javascript.js"></script>\r
+               <script type="text/javascript">\r
+                       //<![CDATA[\r
+                       // Create the logger\r
+                       var log = log4javascript.getLogger(); \r
+               \r
+                       // Create a PopUpAppender with default options\r
+                       var popUpAppender = new log4javascript.PopUpAppender();\r
+                       \r
+                       // Change the desired configuration options\r
+                       popUpAppender.setFocusPopUp(true);\r
+                       popUpAppender.setNewestMessageAtTop(true);\r
+                       \r
+                       // Add the appender to the logger\r
+                       log.addAppender(popUpAppender);\r
+                       \r
+                       // Test the logger\r
+                       log.debug("Hello world!");\r
+                       //]]>\r
+               </script>\r
+       </head>\r
+       <body>\r
+               <h1>log4javascript quick start example 1</h1>\r
+       \r
+       \r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/examples/myloggingservlet.do b/planetstack/core/static/log4javascript-1.4.6/examples/myloggingservlet.do
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/console.html b/planetstack/core/static/log4javascript-1.4.6/js/console.html
new file mode 100644 (file)
index 0000000..476d272
--- /dev/null
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+<head>\r
+<title>log4javascript</title>\r
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+<meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+<script type="text/javascript">var isIe = false, isIePre7 = false;</script>\r
+<!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->\r
+<!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->\r
+<script type="text/javascript">\r
+//<![CDATA[\r
+var loggingEnabled=true;var logQueuedEventsTimer=null;var logEntries=[];var logEntriesAndSeparators=[];var logItems=[];var renderDelay=100;var unrenderedLogItemsExist=false;var rootGroup,currentGroup=null;var loaded=false;var currentLogItem=null;var logMainContainer;function copyProperties(obj,props){for(var i in props){obj[i]=props[i];}}\r
+function LogItem(){}\r
+LogItem.prototype={mainContainer:null,wrappedContainer:null,unwrappedContainer:null,group:null,appendToLog:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].appendToLog();}\r
+this.group.update();},doRemove:function(doUpdate,removeFromGroup){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].remove();}\r
+this.unwrappedElementContainer=null;this.wrappedElementContainer=null;this.mainElementContainer=null;}\r
+if(this.group&&removeFromGroup){this.group.removeChild(this,doUpdate);}\r
+if(this===currentLogItem){currentLogItem=null;}},remove:function(doUpdate,removeFromGroup){this.doRemove(doUpdate,removeFromGroup);},render:function(){},accept:function(visitor){visitor.visit(this);},getUnwrappedDomContainer:function(){return this.group.unwrappedElementContainer.contentDiv;},getWrappedDomContainer:function(){return this.group.wrappedElementContainer.contentDiv;},getMainDomContainer:function(){return this.group.mainElementContainer.contentDiv;}};LogItem.serializedItemKeys={LOG_ENTRY:0,GROUP_START:1,GROUP_END:2};function LogItemContainerElement(){}\r
+LogItemContainerElement.prototype={appendToLog:function(){var insertBeforeFirst=(newestAtTop&&this.containerDomNode.hasChildNodes());if(insertBeforeFirst){this.containerDomNode.insertBefore(this.mainDiv,this.containerDomNode.firstChild);}else{this.containerDomNode.appendChild(this.mainDiv);}}};function SeparatorElementContainer(containerDomNode){this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="separator";this.mainDiv.innerHTML="&nbsp;";}\r
+SeparatorElementContainer.prototype=new LogItemContainerElement();SeparatorElementContainer.prototype.remove=function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;};function Separator(){this.rendered=false;}\r
+Separator.prototype=new LogItem();copyProperties(Separator.prototype,{render:function(){var containerDomNode=this.group.contentDiv;if(isIe){this.unwrappedElementContainer=new SeparatorElementContainer(this.getUnwrappedDomContainer());this.wrappedElementContainer=new SeparatorElementContainer(this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new SeparatorElementContainer(this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}\r
+this.content=this.formattedMessage;this.rendered=true;}});function GroupElementContainer(group,containerDomNode,isRoot,isWrapped){this.group=group;this.containerDomNode=containerDomNode;this.isRoot=isRoot;this.isWrapped=isWrapped;this.expandable=false;if(this.isRoot){if(isIe){this.contentDiv=logMainContainer.appendChild(document.createElement("div"));this.contentDiv.id=this.isWrapped?"log_wrapped":"log_unwrapped";}else{this.contentDiv=logMainContainer;}}else{var groupElementContainer=this;this.mainDiv=document.createElement("div");this.mainDiv.className="group";this.headingDiv=this.mainDiv.appendChild(document.createElement("div"));this.headingDiv.className="groupheading";this.expander=this.headingDiv.appendChild(document.createElement("span"));this.expander.className="expander unselectable greyedout";this.expander.unselectable=true;var expanderText=this.group.expanded?"-":"+";this.expanderTextNode=this.expander.appendChild(document.createTextNode(expanderText));this.headingDiv.appendChild(document.createTextNode(" "+this.group.name));this.contentDiv=this.mainDiv.appendChild(document.createElement("div"));var contentCssClass=this.group.expanded?"expanded":"collapsed";this.contentDiv.className="groupcontent "+contentCssClass;this.expander.onclick=function(){if(groupElementContainer.group.expandable){groupElementContainer.group.toggleExpanded();}};}}\r
+GroupElementContainer.prototype=new LogItemContainerElement();copyProperties(GroupElementContainer.prototype,{toggleExpanded:function(){if(!this.isRoot){var oldCssClass,newCssClass,expanderText;if(this.group.expanded){newCssClass="expanded";oldCssClass="collapsed";expanderText="-";}else{newCssClass="collapsed";oldCssClass="expanded";expanderText="+";}\r
+replaceClass(this.contentDiv,newCssClass,oldCssClass);this.expanderTextNode.nodeValue=expanderText;}},remove:function(){if(!this.isRoot){this.headingDiv=null;this.expander.onclick=null;this.expander=null;this.expanderTextNode=null;this.contentDiv=null;this.containerDomNode=null;this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;}},reverseChildren:function(){var node=null;var childDomNodes=[];while((node=this.contentDiv.firstChild)){this.contentDiv.removeChild(node);childDomNodes.push(node);}\r
+while((node=childDomNodes.pop())){this.contentDiv.appendChild(node);}},update:function(){if(!this.isRoot){if(this.group.expandable){removeClass(this.expander,"greyedout");}else{addClass(this.expander,"greyedout");}}},clear:function(){if(this.isRoot){this.contentDiv.innerHTML="";}}});function Group(name,isRoot,initiallyExpanded){this.name=name;this.group=null;this.isRoot=isRoot;this.initiallyExpanded=initiallyExpanded;this.elementContainers=[];this.children=[];this.expanded=initiallyExpanded;this.rendered=false;this.expandable=false;}\r
+Group.prototype=new LogItem();copyProperties(Group.prototype,{addChild:function(logItem){this.children.push(logItem);logItem.group=this;},render:function(){if(isIe){var unwrappedDomContainer,wrappedDomContainer;if(this.isRoot){unwrappedDomContainer=logMainContainer;wrappedDomContainer=logMainContainer;}else{unwrappedDomContainer=this.getUnwrappedDomContainer();wrappedDomContainer=this.getWrappedDomContainer();}\r
+this.unwrappedElementContainer=new GroupElementContainer(this,unwrappedDomContainer,this.isRoot,false);this.wrappedElementContainer=new GroupElementContainer(this,wrappedDomContainer,this.isRoot,true);this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{var mainDomContainer=this.isRoot?logMainContainer:this.getMainDomContainer();this.mainElementContainer=new GroupElementContainer(this,mainDomContainer,this.isRoot,false);this.elementContainers=[this.mainElementContainer];}\r
+this.rendered=true;},toggleExpanded:function(){this.expanded=!this.expanded;for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].toggleExpanded();}},expand:function(){if(!this.expanded){this.toggleExpanded();}},accept:function(visitor){visitor.visitGroup(this);},reverseChildren:function(){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].reverseChildren();}}},update:function(){var previouslyExpandable=this.expandable;this.expandable=(this.children.length!==0);if(this.expandable!==previouslyExpandable){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].update();}}},flatten:function(){var visitor=new GroupFlattener();this.accept(visitor);return visitor.logEntriesAndSeparators;},removeChild:function(child,doUpdate){array_remove(this.children,child);child.group=null;if(doUpdate){this.update();}},remove:function(doUpdate,removeFromGroup){for(var i=0,len=this.children.length;i<len;i++){this.children[i].remove(false,false);}\r
+this.children=[];this.update();if(this===currentGroup){currentGroup=this.group;}\r
+this.doRemove(doUpdate,removeFromGroup);},serialize:function(items){items.push([LogItem.serializedItemKeys.GROUP_START,this.name]);for(var i=0,len=this.children.length;i<len;i++){this.children[i].serialize(items);}\r
+if(this!==currentGroup){items.push([LogItem.serializedItemKeys.GROUP_END]);}},clear:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clear();}}});function LogEntryElementContainer(){}\r
+LogEntryElementContainer.prototype=new LogItemContainerElement();copyProperties(LogEntryElementContainer.prototype,{remove:function(){this.doRemove();},doRemove:function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;this.contentElement=null;this.containerDomNode=null;},setContent:function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=content;}},setSearchMatch:function(isMatch){var oldCssClass=isMatch?"searchnonmatch":"searchmatch";var newCssClass=isMatch?"searchmatch":"searchnonmatch";replaceClass(this.mainDiv,newCssClass,oldCssClass);},clearSearch:function(){removeClass(this.mainDiv,"searchmatch");removeClass(this.mainDiv,"searchnonmatch");}});function LogEntryWrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.mainDiv.className="logentry wrapped "+this.logEntry.level;this.contentElement=this.mainDiv;}\r
+LogEntryWrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryWrappedElementContainer.prototype.setContent=function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=wrappedContent;}};function LogEntryUnwrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry unwrapped "+this.logEntry.level;this.pre=this.mainDiv.appendChild(document.createElement("pre"));this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.pre.className="unwrapped";this.contentElement=this.pre;}\r
+LogEntryUnwrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryUnwrappedElementContainer.prototype.remove=function(){this.doRemove();this.pre=null;};function LogEntryMainElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry nonielogentry "+this.logEntry.level;this.contentElement=this.mainDiv.appendChild(document.createElement("span"));this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));}\r
+LogEntryMainElementContainer.prototype=new LogEntryElementContainer();function LogEntry(level,formattedMessage){this.level=level;this.formattedMessage=formattedMessage;this.rendered=false;}\r
+LogEntry.prototype=new LogItem();copyProperties(LogEntry.prototype,{render:function(){var logEntry=this;var containerDomNode=this.group.contentDiv;if(isIe){this.formattedMessage=this.formattedMessage.replace(/\r\n/g,"\r");this.unwrappedElementContainer=new LogEntryUnwrappedElementContainer(this,this.getUnwrappedDomContainer());this.wrappedElementContainer=new LogEntryWrappedElementContainer(this,this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new LogEntryMainElementContainer(this,this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}\r
+this.content=this.formattedMessage;this.rendered=true;},setContent:function(content,wrappedContent){if(content!=this.content){if(isIe&&(content!==this.formattedMessage)){content=content.replace(/\r\n/g,"\r");}\r
+for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setContent(content,wrappedContent);}\r
+this.content=content;}},getSearchMatches:function(){var matches=[];var i,len;if(isIe){var unwrappedEls=getElementsByClass(this.unwrappedElementContainer.mainDiv,"searchterm","span");var wrappedEls=getElementsByClass(this.wrappedElementContainer.mainDiv,"searchterm","span");for(i=0,len=unwrappedEls.length;i<len;i++){matches[i]=new Match(this.level,null,unwrappedEls[i],wrappedEls[i]);}}else{var els=getElementsByClass(this.mainElementContainer.mainDiv,"searchterm","span");for(i=0,len=els.length;i<len;i++){matches[i]=new Match(this.level,els[i]);}}\r
+return matches;},setSearchMatch:function(isMatch){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setSearchMatch(isMatch);}},clearSearch:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clearSearch();}},accept:function(visitor){visitor.visitLogEntry(this);},serialize:function(items){items.push([LogItem.serializedItemKeys.LOG_ENTRY,this.level,this.formattedMessage]);}});function LogItemVisitor(){}\r
+LogItemVisitor.prototype={visit:function(logItem){},visitParent:function(logItem){if(logItem.group){logItem.group.accept(this);}},visitChildren:function(logItem){for(var i=0,len=logItem.children.length;i<len;i++){logItem.children[i].accept(this);}},visitLogEntry:function(logEntry){this.visit(logEntry);},visitSeparator:function(separator){this.visit(separator);},visitGroup:function(group){this.visit(group);}};function GroupFlattener(){this.logEntriesAndSeparators=[];}\r
+GroupFlattener.prototype=new LogItemVisitor();GroupFlattener.prototype.visitGroup=function(group){this.visitChildren(group);};GroupFlattener.prototype.visitLogEntry=function(logEntry){this.logEntriesAndSeparators.push(logEntry);};GroupFlattener.prototype.visitSeparator=function(separator){this.logEntriesAndSeparators.push(separator);};window.onload=function(){if(location.search){var queryBits=unescape(location.search).substr(1).split("&"),nameValueBits;for(var i=0,len=queryBits.length;i<len;i++){nameValueBits=queryBits[i].split("=");if(nameValueBits[0]=="log4javascript_domain"){document.domain=nameValueBits[1];break;}}}\r
+logMainContainer=$("log");if(isIePre7){addClass(logMainContainer,"oldIe");}\r
+rootGroup=new Group("root",true);rootGroup.render();currentGroup=rootGroup;setCommandInputWidth();setLogContainerHeight();toggleLoggingEnabled();toggleSearchEnabled();toggleSearchFilter();toggleSearchHighlight();applyFilters();checkAllLevels();toggleWrap();toggleNewestAtTop();toggleScrollToLatest();renderQueuedLogItems();loaded=true;$("command").value="";$("command").autocomplete="off";$("command").onkeydown=function(evt){evt=getEvent(evt);if(evt.keyCode==10||evt.keyCode==13){evalCommandLine();stopPropagation(evt);}else if(evt.keyCode==27){this.value="";this.focus();}else if(evt.keyCode==38&&commandHistory.length>0){currentCommandIndex=Math.max(0,currentCommandIndex-1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}else if(evt.keyCode==40&&commandHistory.length>0){currentCommandIndex=Math.min(commandHistory.length-1,currentCommandIndex+1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}};$("command").onkeypress=function(evt){evt=getEvent(evt);if(evt.keyCode==38&&commandHistory.length>0&&evt.preventDefault){evt.preventDefault();}};$("command").onkeyup=function(evt){evt=getEvent(evt);if(evt.keyCode==27&&evt.preventDefault){evt.preventDefault();this.focus();}};document.onkeydown=function keyEventHandler(evt){evt=getEvent(evt);switch(evt.keyCode){case 69:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){evalLastCommand();cancelKeyEvent(evt);return false;}\r
+break;case 75:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusSearch();cancelKeyEvent(evt);return false;}\r
+break;case 40:case 76:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusCommandLine();cancelKeyEvent(evt);return false;}\r
+break;}};setTimeout(setLogContainerHeight,20);setShowCommandLine(showCommandLine);doSearch();};window.onunload=function(){if(mainWindowExists()){appender.unload();}\r
+appender=null;};function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}\r
+function setLoggingEnabled(enable){loggingEnabled=enable;}\r
+var appender=null;function setAppender(appenderParam){appender=appenderParam;}\r
+function setShowCloseButton(showCloseButton){$("closeButton").style.display=showCloseButton?"inline":"none";}\r
+function setShowHideButton(showHideButton){$("hideButton").style.display=showHideButton?"inline":"none";}\r
+var newestAtTop=false;function LogItemContentReverser(){}\r
+LogItemContentReverser.prototype=new LogItemVisitor();LogItemContentReverser.prototype.visitGroup=function(group){group.reverseChildren();this.visitChildren(group);};function setNewestAtTop(isNewestAtTop){var oldNewestAtTop=newestAtTop;var i,iLen,j,jLen;newestAtTop=Boolean(isNewestAtTop);if(oldNewestAtTop!=newestAtTop){var visitor=new LogItemContentReverser();rootGroup.accept(visitor);if(currentSearch){var currentMatch=currentSearch.matches[currentMatchIndex];var matchIndex=0;var matches=[];var actOnLogEntry=function(logEntry){var logEntryMatches=logEntry.getSearchMatches();for(j=0,jLen=logEntryMatches.length;j<jLen;j++){matches[matchIndex]=logEntryMatches[j];if(currentMatch&&logEntryMatches[j].equals(currentMatch)){currentMatchIndex=matchIndex;}\r
+matchIndex++;}};if(newestAtTop){for(i=logEntries.length-1;i>=0;i--){actOnLogEntry(logEntries[i]);}}else{for(i=0,iLen=logEntries.length;i<iLen;i++){actOnLogEntry(logEntries[i]);}}\r
+currentSearch.matches=matches;if(currentMatch){currentMatch.setCurrent();}}else if(scrollToLatest){doScrollToLatest();}}\r
+$("newestAtTop").checked=isNewestAtTop;}\r
+function toggleNewestAtTop(){var isNewestAtTop=$("newestAtTop").checked;setNewestAtTop(isNewestAtTop);}\r
+var scrollToLatest=true;function setScrollToLatest(isScrollToLatest){scrollToLatest=isScrollToLatest;if(scrollToLatest){doScrollToLatest();}\r
+$("scrollToLatest").checked=isScrollToLatest;}\r
+function toggleScrollToLatest(){var isScrollToLatest=$("scrollToLatest").checked;setScrollToLatest(isScrollToLatest);}\r
+function doScrollToLatest(){var l=logMainContainer;if(typeof l.scrollTop!="undefined"){if(newestAtTop){l.scrollTop=0;}else{var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}}\r
+var closeIfOpenerCloses=true;function setCloseIfOpenerCloses(isCloseIfOpenerCloses){closeIfOpenerCloses=isCloseIfOpenerCloses;}\r
+var maxMessages=null;function setMaxMessages(max){maxMessages=max;pruneLogEntries();}\r
+var showCommandLine=false;function setShowCommandLine(isShowCommandLine){showCommandLine=isShowCommandLine;if(loaded){$("commandLine").style.display=showCommandLine?"block":"none";setCommandInputWidth();setLogContainerHeight();}}\r
+function focusCommandLine(){if(loaded){$("command").focus();}}\r
+function focusSearch(){if(loaded){$("searchBox").focus();}}\r
+function getLogItems(){var items=[];for(var i=0,len=logItems.length;i<len;i++){logItems[i].serialize(items);}\r
+return items;}\r
+function setLogItems(items){var loggingReallyEnabled=loggingEnabled;loggingEnabled=true;for(var i=0,len=items.length;i<len;i++){switch(items[i][0]){case LogItem.serializedItemKeys.LOG_ENTRY:log(items[i][1],items[i][2]);break;case LogItem.serializedItemKeys.GROUP_START:group(items[i][1]);break;case LogItem.serializedItemKeys.GROUP_END:groupEnd();break;}}\r
+loggingEnabled=loggingReallyEnabled;}\r
+function log(logLevel,formattedMessage){if(loggingEnabled){var logEntry=new LogEntry(logLevel,formattedMessage);logEntries.push(logEntry);logEntriesAndSeparators.push(logEntry);logItems.push(logEntry);currentGroup.addChild(logEntry);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}\r
+logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}\r
+function renderQueuedLogItems(){logQueuedEventsTimer=null;var pruned=pruneLogEntries();var initiallyHasMatches=currentSearch?currentSearch.hasMatches():false;for(var i=0,len=logItems.length;i<len;i++){if(!logItems[i].rendered){logItems[i].render();logItems[i].appendToLog();if(currentSearch&&(logItems[i]instanceof LogEntry)){currentSearch.applyTo(logItems[i]);}}}\r
+if(currentSearch){if(pruned){if(currentSearch.hasVisibleMatches()){if(currentMatchIndex===null){setCurrentMatchIndex(0);}\r
+displayMatches();}else{displayNoMatches();}}else if(!initiallyHasMatches&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}}\r
+if(scrollToLatest){doScrollToLatest();}\r
+unrenderedLogItemsExist=false;}\r
+function pruneLogEntries(){if((maxMessages!==null)&&(logEntriesAndSeparators.length>maxMessages)){var numberToDelete=logEntriesAndSeparators.length-maxMessages;var prunedLogEntries=logEntriesAndSeparators.slice(0,numberToDelete);if(currentSearch){currentSearch.removeMatches(prunedLogEntries);}\r
+var group;for(var i=0;i<numberToDelete;i++){group=logEntriesAndSeparators[i].group;array_remove(logItems,logEntriesAndSeparators[i]);array_remove(logEntries,logEntriesAndSeparators[i]);logEntriesAndSeparators[i].remove(true,true);if(group.children.length===0&&group!==currentGroup&&group!==rootGroup){array_remove(logItems,group);group.remove(true,true);}}\r
+logEntriesAndSeparators=array_removeFromStart(logEntriesAndSeparators,numberToDelete);return true;}\r
+return false;}\r
+function group(name,startExpanded){if(loggingEnabled){initiallyExpanded=(typeof startExpanded==="undefined")?true:Boolean(startExpanded);var newGroup=new Group(name,false,initiallyExpanded);currentGroup.addChild(newGroup);currentGroup=newGroup;logItems.push(newGroup);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}\r
+logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}\r
+function groupEnd(){currentGroup=(currentGroup===rootGroup)?rootGroup:currentGroup.group;}\r
+function mainPageReloaded(){currentGroup=rootGroup;var separator=new Separator();logEntriesAndSeparators.push(separator);logItems.push(separator);currentGroup.addChild(separator);}\r
+function closeWindow(){if(appender&&mainWindowExists()){appender.close(true);}else{window.close();}}\r
+function hide(){if(appender&&mainWindowExists()){appender.hide();}}\r
+var mainWindow=window;var windowId="log4javascriptConsoleWindow_"+new Date().getTime()+"_"+(""+Math.random()).substr(2);function setMainWindow(win){mainWindow=win;mainWindow[windowId]=window;if(opener&&closeIfOpenerCloses){pollOpener();}}\r
+function pollOpener(){if(closeIfOpenerCloses){if(mainWindowExists()){setTimeout(pollOpener,500);}else{closeWindow();}}}\r
+function mainWindowExists(){try{return(mainWindow&&!mainWindow.closed&&mainWindow[windowId]==window);}catch(ex){}\r
+return false;}\r
+var logLevels=["TRACE","DEBUG","INFO","WARN","ERROR","FATAL"];function getCheckBox(logLevel){return $("switch_"+logLevel);}\r
+function getIeWrappedLogContainer(){return $("log_wrapped");}\r
+function getIeUnwrappedLogContainer(){return $("log_unwrapped");}\r
+function applyFilters(){for(var i=0;i<logLevels.length;i++){if(getCheckBox(logLevels[i]).checked){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}\r
+updateSearchFromFilters();}\r
+function toggleAllLevels(){var turnOn=$("switch_ALL").checked;for(var i=0;i<logLevels.length;i++){getCheckBox(logLevels[i]).checked=turnOn;if(turnOn){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}}\r
+function checkAllLevels(){for(var i=0;i<logLevels.length;i++){if(!getCheckBox(logLevels[i]).checked){getCheckBox("ALL").checked=false;return;}}\r
+getCheckBox("ALL").checked=true;}\r
+function clearLog(){rootGroup.clear();currentGroup=rootGroup;logEntries=[];logItems=[];logEntriesAndSeparators=[];doSearch();}\r
+function toggleWrap(){var enable=$("wrap").checked;if(enable){addClass(logMainContainer,"wrap");}else{removeClass(logMainContainer,"wrap");}\r
+refreshCurrentMatch();}\r
+var searchTimer=null;function scheduleSearch(){try{clearTimeout(searchTimer);}catch(ex){}\r
+searchTimer=setTimeout(doSearch,500);}\r
+function Search(searchTerm,isRegex,searchRegex,isCaseSensitive){this.searchTerm=searchTerm;this.isRegex=isRegex;this.searchRegex=searchRegex;this.isCaseSensitive=isCaseSensitive;this.matches=[];}\r
+Search.prototype={hasMatches:function(){return this.matches.length>0;},hasVisibleMatches:function(){if(this.hasMatches()){for(var i=0;i<this.matches.length;i++){if(this.matches[i].isVisible()){return true;}}}\r
+return false;},match:function(logEntry){var entryText=String(logEntry.formattedMessage);var matchesSearch=false;if(this.isRegex){matchesSearch=this.searchRegex.test(entryText);}else if(this.isCaseSensitive){matchesSearch=(entryText.indexOf(this.searchTerm)>-1);}else{matchesSearch=(entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase())>-1);}\r
+return matchesSearch;},getNextVisibleMatchIndex:function(){for(var i=currentMatchIndex+1;i<this.matches.length;i++){if(this.matches[i].isVisible()){return i;}}\r
+for(i=0;i<=currentMatchIndex;i++){if(this.matches[i].isVisible()){return i;}}\r
+return-1;},getPreviousVisibleMatchIndex:function(){for(var i=currentMatchIndex-1;i>=0;i--){if(this.matches[i].isVisible()){return i;}}\r
+for(var i=this.matches.length-1;i>=currentMatchIndex;i--){if(this.matches[i].isVisible()){return i;}}\r
+return-1;},applyTo:function(logEntry){var doesMatch=this.match(logEntry);if(doesMatch){logEntry.group.expand();logEntry.setSearchMatch(true);var logEntryContent;var wrappedLogEntryContent;var searchTermReplacementStartTag="<span class=\"searchterm\">";var searchTermReplacementEndTag="<"+"/span>";var preTagName=isIe?"pre":"span";var preStartTag="<"+preTagName+" class=\"pre\">";var preEndTag="<"+"/"+preTagName+">";var startIndex=0;var searchIndex,matchedText,textBeforeMatch;if(this.isRegex){var flags=this.isCaseSensitive?"g":"gi";var capturingRegex=new RegExp("("+this.searchRegex.source+")",flags);var rnd=(""+Math.random()).substr(2);var startToken="%%s"+rnd+"%%";var endToken="%%e"+rnd+"%%";logEntryContent=logEntry.formattedMessage.replace(capturingRegex,startToken+"$1"+endToken);logEntryContent=escapeHtml(logEntryContent);var result;var searchString=logEntryContent;logEntryContent="";wrappedLogEntryContent="";while((searchIndex=searchString.indexOf(startToken,startIndex))>-1){var endTokenIndex=searchString.indexOf(endToken,searchIndex);matchedText=searchString.substring(searchIndex+startToken.length,endTokenIndex);textBeforeMatch=searchString.substring(startIndex,searchIndex);logEntryContent+=preStartTag+textBeforeMatch+preEndTag;logEntryContent+=searchTermReplacementStartTag+preStartTag+matchedText+\r
+preEndTag+searchTermReplacementEndTag;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+\r
+matchedText+searchTermReplacementEndTag;}\r
+startIndex=endTokenIndex+endToken.length;}\r
+logEntryContent+=preStartTag+searchString.substr(startIndex)+preEndTag;if(isIe){wrappedLogEntryContent+=searchString.substr(startIndex);}}else{logEntryContent="";wrappedLogEntryContent="";var searchTermReplacementLength=searchTermReplacementStartTag.length+\r
+this.searchTerm.length+searchTermReplacementEndTag.length;var searchTermLength=this.searchTerm.length;var searchTermLowerCase=this.searchTerm.toLowerCase();var logTextLowerCase=logEntry.formattedMessage.toLowerCase();while((searchIndex=logTextLowerCase.indexOf(searchTermLowerCase,startIndex))>-1){matchedText=escapeHtml(logEntry.formattedMessage.substr(searchIndex,this.searchTerm.length));textBeforeMatch=escapeHtml(logEntry.formattedMessage.substring(startIndex,searchIndex));var searchTermReplacement=searchTermReplacementStartTag+\r
+preStartTag+matchedText+preEndTag+searchTermReplacementEndTag;logEntryContent+=preStartTag+textBeforeMatch+preEndTag+searchTermReplacement;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+\r
+matchedText+searchTermReplacementEndTag;}\r
+startIndex=searchIndex+searchTermLength;}\r
+var textAfterLastMatch=escapeHtml(logEntry.formattedMessage.substr(startIndex));logEntryContent+=preStartTag+textAfterLastMatch+preEndTag;if(isIe){wrappedLogEntryContent+=textAfterLastMatch;}}\r
+logEntry.setContent(logEntryContent,wrappedLogEntryContent);var logEntryMatches=logEntry.getSearchMatches();this.matches=this.matches.concat(logEntryMatches);}else{logEntry.setSearchMatch(false);logEntry.setContent(logEntry.formattedMessage,logEntry.formattedMessage);}\r
+return doesMatch;},removeMatches:function(logEntries){var matchesToRemoveCount=0;var currentMatchRemoved=false;var matchesToRemove=[];var i,iLen,j,jLen;for(i=0,iLen=this.matches.length;i<iLen;i++){for(j=0,jLen=logEntries.length;j<jLen;j++){if(this.matches[i].belongsTo(logEntries[j])){matchesToRemove.push(this.matches[i]);if(i===currentMatchIndex){currentMatchRemoved=true;}}}}\r
+var newMatch=currentMatchRemoved?null:this.matches[currentMatchIndex];if(currentMatchRemoved){for(i=currentMatchIndex,iLen=this.matches.length;i<iLen;i++){if(this.matches[i].isVisible()&&!array_contains(matchesToRemove,this.matches[i])){newMatch=this.matches[i];break;}}}\r
+for(i=0,iLen=matchesToRemove.length;i<iLen;i++){array_remove(this.matches,matchesToRemove[i]);matchesToRemove[i].remove();}\r
+if(this.hasVisibleMatches()){if(newMatch===null){setCurrentMatchIndex(0);}else{var newMatchIndex=0;for(i=0,iLen=this.matches.length;i<iLen;i++){if(newMatch===this.matches[i]){newMatchIndex=i;break;}}\r
+setCurrentMatchIndex(newMatchIndex);}}else{currentMatchIndex=null;displayNoMatches();}}};function getPageOffsetTop(el,container){var currentEl=el;var y=0;while(currentEl&&currentEl!=container){y+=currentEl.offsetTop;currentEl=currentEl.offsetParent;}\r
+return y;}\r
+function scrollIntoView(el){var logContainer=logMainContainer;if(!$("wrap").checked){var logContainerLeft=logContainer.scrollLeft;var logContainerRight=logContainerLeft+logContainer.offsetWidth;var elLeft=el.offsetLeft;var elRight=elLeft+el.offsetWidth;if(elLeft<logContainerLeft||elRight>logContainerRight){logContainer.scrollLeft=elLeft-(logContainer.offsetWidth-el.offsetWidth)/2;}}\r
+var logContainerTop=logContainer.scrollTop;var logContainerBottom=logContainerTop+logContainer.offsetHeight;var elTop=getPageOffsetTop(el)-getToolBarsHeight();var elBottom=elTop+el.offsetHeight;if(elTop<logContainerTop||elBottom>logContainerBottom){logContainer.scrollTop=elTop-(logContainer.offsetHeight-el.offsetHeight)/2;}}\r
+function Match(logEntryLevel,spanInMainDiv,spanInUnwrappedPre,spanInWrappedDiv){this.logEntryLevel=logEntryLevel;this.spanInMainDiv=spanInMainDiv;if(isIe){this.spanInUnwrappedPre=spanInUnwrappedPre;this.spanInWrappedDiv=spanInWrappedDiv;}\r
+this.mainSpan=isIe?spanInUnwrappedPre:spanInMainDiv;}\r
+Match.prototype={equals:function(match){return this.mainSpan===match.mainSpan;},setCurrent:function(){if(isIe){addClass(this.spanInUnwrappedPre,"currentmatch");addClass(this.spanInWrappedDiv,"currentmatch");var elementToScroll=$("wrap").checked?this.spanInWrappedDiv:this.spanInUnwrappedPre;scrollIntoView(elementToScroll);}else{addClass(this.spanInMainDiv,"currentmatch");scrollIntoView(this.spanInMainDiv);}},belongsTo:function(logEntry){if(isIe){return isDescendant(this.spanInUnwrappedPre,logEntry.unwrappedPre);}else{return isDescendant(this.spanInMainDiv,logEntry.mainDiv);}},setNotCurrent:function(){if(isIe){removeClass(this.spanInUnwrappedPre,"currentmatch");removeClass(this.spanInWrappedDiv,"currentmatch");}else{removeClass(this.spanInMainDiv,"currentmatch");}},isOrphan:function(){return isOrphan(this.mainSpan);},isVisible:function(){return getCheckBox(this.logEntryLevel).checked;},remove:function(){if(isIe){this.spanInUnwrappedPre=null;this.spanInWrappedDiv=null;}else{this.spanInMainDiv=null;}}};var currentSearch=null;var currentMatchIndex=null;function doSearch(){var searchBox=$("searchBox");var searchTerm=searchBox.value;var isRegex=$("searchRegex").checked;var isCaseSensitive=$("searchCaseSensitive").checked;var i;if(searchTerm===""){$("searchReset").disabled=true;$("searchNav").style.display="none";removeClass(document.body,"searching");removeClass(searchBox,"hasmatches");removeClass(searchBox,"nomatches");for(i=0;i<logEntries.length;i++){logEntries[i].clearSearch();logEntries[i].setContent(logEntries[i].formattedMessage,logEntries[i].formattedMessage);}\r
+currentSearch=null;setLogContainerHeight();}else{$("searchReset").disabled=false;$("searchNav").style.display="block";var searchRegex;var regexValid;if(isRegex){try{searchRegex=isCaseSensitive?new RegExp(searchTerm,"g"):new RegExp(searchTerm,"gi");regexValid=true;replaceClass(searchBox,"validregex","invalidregex");searchBox.title="Valid regex";}catch(ex){regexValid=false;replaceClass(searchBox,"invalidregex","validregex");searchBox.title="Invalid regex: "+(ex.message?ex.message:(ex.description?ex.description:"unknown error"));return;}}else{searchBox.title="";removeClass(searchBox,"validregex");removeClass(searchBox,"invalidregex");}\r
+addClass(document.body,"searching");currentSearch=new Search(searchTerm,isRegex,searchRegex,isCaseSensitive);for(i=0;i<logEntries.length;i++){currentSearch.applyTo(logEntries[i]);}\r
+setLogContainerHeight();if(currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}else{displayNoMatches();}}}\r
+function updateSearchFromFilters(){if(currentSearch){if(currentSearch.hasMatches()){if(currentMatchIndex===null){currentMatchIndex=0;}\r
+var currentMatch=currentSearch.matches[currentMatchIndex];if(currentMatch.isVisible()){displayMatches();setCurrentMatchIndex(currentMatchIndex);}else{currentMatch.setNotCurrent();var nextVisibleMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextVisibleMatchIndex>-1){setCurrentMatchIndex(nextVisibleMatchIndex);displayMatches();}else{displayNoMatches();}}}else{displayNoMatches();}}}\r
+function refreshCurrentMatch(){if(currentSearch&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(currentMatchIndex);}}\r
+function displayMatches(){replaceClass($("searchBox"),"hasmatches","nomatches");$("searchBox").title=""+currentSearch.matches.length+" matches found";$("searchNav").style.display="block";setLogContainerHeight();}\r
+function displayNoMatches(){replaceClass($("searchBox"),"nomatches","hasmatches");$("searchBox").title="No matches found";$("searchNav").style.display="none";setLogContainerHeight();}\r
+function toggleSearchEnabled(enable){enable=(typeof enable=="undefined")?!$("searchDisable").checked:enable;$("searchBox").disabled=!enable;$("searchReset").disabled=!enable;$("searchRegex").disabled=!enable;$("searchNext").disabled=!enable;$("searchPrevious").disabled=!enable;$("searchCaseSensitive").disabled=!enable;$("searchNav").style.display=(enable&&($("searchBox").value!=="")&&currentSearch&&currentSearch.hasVisibleMatches())?"block":"none";if(enable){removeClass($("search"),"greyedout");addClass(document.body,"searching");if($("searchHighlight").checked){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}\r
+if($("searchFilter").checked){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}\r
+$("searchDisable").checked=!enable;}else{addClass($("search"),"greyedout");removeClass(document.body,"searching");removeClass(logMainContainer,"searchhighlight");removeClass(logMainContainer,"searchfilter");}\r
+setLogContainerHeight();}\r
+function toggleSearchFilter(){var enable=$("searchFilter").checked;if(enable){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}\r
+refreshCurrentMatch();}\r
+function toggleSearchHighlight(){var enable=$("searchHighlight").checked;if(enable){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}}\r
+function clearSearch(){$("searchBox").value="";doSearch();}\r
+function searchNext(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var nextMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextMatchIndex>currentMatchIndex||confirm("Reached the end of the page. Start from the top?")){setCurrentMatchIndex(nextMatchIndex);}}}\r
+function searchPrevious(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var previousMatchIndex=currentSearch.getPreviousVisibleMatchIndex();if(previousMatchIndex<currentMatchIndex||confirm("Reached the start of the page. Continue from the bottom?")){setCurrentMatchIndex(previousMatchIndex);}}}\r
+function setCurrentMatchIndex(index){currentMatchIndex=index;currentSearch.matches[currentMatchIndex].setCurrent();}\r
+function addClass(el,cssClass){if(!hasClass(el,cssClass)){if(el.className){el.className+=" "+cssClass;}else{el.className=cssClass;}}}\r
+function hasClass(el,cssClass){if(el.className){var classNames=el.className.split(" ");return array_contains(classNames,cssClass);}\r
+return false;}\r
+function removeClass(el,cssClass){if(hasClass(el,cssClass)){var existingClasses=el.className.split(" ");var newClasses=[];for(var i=0,len=existingClasses.length;i<len;i++){if(existingClasses[i]!=cssClass){newClasses[newClasses.length]=existingClasses[i];}}\r
+el.className=newClasses.join(" ");}}\r
+function replaceClass(el,newCssClass,oldCssClass){removeClass(el,oldCssClass);addClass(el,newCssClass);}\r
+function getElementsByClass(el,cssClass,tagName){var elements=el.getElementsByTagName(tagName);var matches=[];for(var i=0,len=elements.length;i<len;i++){if(hasClass(elements[i],cssClass)){matches.push(elements[i]);}}\r
+return matches;}\r
+function $(id){return document.getElementById(id);}\r
+function isDescendant(node,ancestorNode){while(node!=null){if(node===ancestorNode){return true;}\r
+node=node.parentNode;}\r
+return false;}\r
+function isOrphan(node){var currentNode=node;while(currentNode){if(currentNode==document.body){return false;}\r
+currentNode=currentNode.parentNode;}\r
+return true;}\r
+function escapeHtml(str){return str.replace(/&/g,"&amp;").replace(/[<]/g,"&lt;").replace(/>/g,"&gt;");}\r
+function getWindowWidth(){if(window.innerWidth){return window.innerWidth;}else if(document.documentElement&&document.documentElement.clientWidth){return document.documentElement.clientWidth;}else if(document.body){return document.body.clientWidth;}\r
+return 0;}\r
+function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}\r
+return 0;}\r
+function getToolBarsHeight(){return $("switches").offsetHeight;}\r
+function getChromeHeight(){var height=getToolBarsHeight();if(showCommandLine){height+=$("commandLine").offsetHeight;}\r
+return height;}\r
+function setLogContainerHeight(){if(logMainContainer){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";logMainContainer.style.height=""+\r
+Math.max(0,windowHeight-getChromeHeight())+"px";}}\r
+function setCommandInputWidth(){if(showCommandLine){$("command").style.width=""+Math.max(0,$("commandLineContainer").offsetWidth-\r
+($("evaluateButton").offsetWidth+13))+"px";}}\r
+window.onresize=function(){setCommandInputWidth();setLogContainerHeight();};if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}\r
+return this.length;};}\r
+if(!Array.prototype.pop){Array.prototype.pop=function(){if(this.length>0){var val=this[this.length-1];this.length=this.length-1;return val;}};}\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length=this.length-1;return firstItem;}};}\r
+if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}\r
+var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}\r
+return itemsDeleted;};}\r
+function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}\r
+if(index>=0){arr.splice(index,1);return index;}else{return false;}}\r
+function array_removeFromStart(array,numberToRemove){if(Array.prototype.splice){array.splice(0,numberToRemove);}else{for(var i=numberToRemove,len=array.length;i<len;i++){array[i-numberToRemove]=array[i];}\r
+array.length=array.length-numberToRemove;}\r
+return array;}\r
+function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function getErrorMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}\r
+return""+ex;}\r
+function moveCaretToEnd(input){if(input.setSelectionRange){input.focus();var length=input.value.length;input.setSelectionRange(length,length);}else if(input.createTextRange){var range=input.createTextRange();range.collapse(false);range.select();}\r
+input.focus();}\r
+function stopPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}}\r
+function getEvent(evt){return evt?evt:event;}\r
+function getTarget(evt){return evt.target?evt.target:evt.srcElement;}\r
+function getRelatedTarget(evt){if(evt.relatedTarget){return evt.relatedTarget;}else if(evt.srcElement){switch(evt.type){case"mouseover":return evt.fromElement;case"mouseout":return evt.toElement;default:return evt.srcElement;}}}\r
+function cancelKeyEvent(evt){evt.returnValue=false;stopPropagation(evt);}\r
+function evalCommandLine(){var expr=$("command").value;evalCommand(expr);$("command").value="";}\r
+function evalLastCommand(){if(lastCommand!=null){evalCommand(lastCommand);}}\r
+var lastCommand=null;var commandHistory=[];var currentCommandIndex=0;function evalCommand(expr){if(appender){appender.evalCommandAndAppend(expr);}else{var prefix=">>> "+expr+"\r\n";try{log("INFO",prefix+eval(expr));}catch(ex){log("ERROR",prefix+"Error: "+getErrorMessage(ex));}}\r
+if(expr!=commandHistory[commandHistory.length-1]){commandHistory.push(expr);if(appender){appender.storeCommandHistory(commandHistory);}}\r
+currentCommandIndex=(expr==commandHistory[currentCommandIndex])?currentCommandIndex+1:commandHistory.length;lastCommand=expr;}\r
+//]]>\r
+</script>\r
+<style type="text/css">\r
+body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#switchesContainer input{margin-bottom:0}div.toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div.toolbar,div#search input{font-family:tahoma,verdana,arial,helvetica,sans-serif}div.toolbar input.button{padding:0 5px;font-size:100%}div.toolbar input.hidden{display:none}div#switches input#clearButton{margin-left:20px}div#levels label{font-weight:bold}div#levels label,div#options label{margin-right:5px}div#levels label#wrapLabel{font-weight:normal}div#search label{margin-right:10px}div#search label.searchboxlabel{margin-right:0}div#search input{font-size:100%}div#search input.validregex{color:green}div#search input.invalidregex{color:red}div#search input.nomatches{color:white;background-color:#ff6666}div#search input.nomatches{color:white;background-color:#ff6666}div#searchNav{display:none}div#commandLine{display:none}div#commandLine input#command{font-size:100%;font-family:Courier New,Courier}div#commandLine input#evaluateButton{}*.greyedout{color:gray !important;border-color:gray !important}*.greyedout *.alwaysenabled{color:black}*.unselectable{-khtml-user-select:none;-moz-user-select:none;user-select:none}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both;position:relative}div.group{border-color:#cccccc;border-style:solid;border-width:1px 0 1px 1px;overflow:visible}div.oldIe div.group,div.oldIe div.group *,div.oldIe *.logentry{height:1%}div.group div.groupheading span.expander{border:solid black 1px;font-family:Courier New,Courier;font-size:0.833em;background-color:#eeeeee;position:relative;top:-1px;color:black;padding:0 2px;cursor:pointer;cursor:hand;height:1%}div.group div.groupcontent{margin-left:10px;padding-bottom:2px;overflow:visible}div.group div.expanded{display:block}div.group div.collapsed{display:none}*.logentry{overflow:visible;display:none;white-space:pre}span.pre{white-space:pre}pre.unwrapped{display:inline !important}pre.unwrapped pre.pre,div.wrapped pre.pre{display:inline}div.wrapped pre.pre{white-space:normal}div.wrapped{display:none}body.searching *.logentry span.currentmatch{color:white !important;background-color:green !important}body.searching div.searchhighlight *.logentry span.searchterm{color:black;background-color:yellow}div.wrap *.logentry{white-space:normal !important;border-width:0 0 1px 0;border-color:#dddddd;border-style:dotted}div.wrap #log_wrapped,#log_unwrapped{display:block}div.wrap #log_unwrapped,#log_wrapped{display:none}div.wrap *.logentry span.pre{overflow:visible;white-space:normal}div.wrap *.logentry pre.unwrapped{display:none}div.wrap *.logentry span.wrapped{display:inline}div.searchfilter *.searchnonmatch{display:none !important}div#log *.TRACE,label#label_TRACE{color:#666666}div#log *.DEBUG,label#label_DEBUG{color:green}div#log *.INFO,label#label_INFO{color:#000099}div#log *.WARN,label#label_WARN{color:#999900}div#log *.ERROR,label#label_ERROR{color:red}div#log *.FATAL,label#label_FATAL{color:#660066}div.TRACE#log *.TRACE,div.DEBUG#log *.DEBUG,div.INFO#log *.INFO,div.WARN#log *.WARN,div.ERROR#log *.ERROR,div.FATAL#log *.FATAL{display:block}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}\r
+</style>\r
+</head>\r
+<body id="body">\r
+<div id="switchesContainer">\r
+<div id="switches">\r
+<div id="levels" class="toolbar">\r
+Filters:\r
+<input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>\r
+<input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>\r
+<input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>\r
+<input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>\r
+<input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>\r
+<input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>\r
+<input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>\r
+</div>\r
+<div id="search" class="toolbar">\r
+<label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />\r
+<input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />\r
+<input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>\r
+<input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>\r
+<input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>\r
+<div id="searchNav">\r
+<input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />\r
+<input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />\r
+<input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>\r
+<input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>\r
+</div>\r
+</div>\r
+<div id="options" class="toolbar">\r
+Options:\r
+<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>\r
+<input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>\r
+<input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>\r
+<input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>\r
+<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />\r
+<input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />\r
+<input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />\r
+</div>\r
+</div>\r
+</div>\r
+<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+<div id="commandLine" class="toolbar">\r
+<div id="commandLineContainer">\r
+<input type="text" id="command" title="Enter a JavaScript command here and hit return or press 'Evaluate'" />\r
+<input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />\r
+</div>\r
+</div>\r
+</body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/console_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/js/console_uncompressed.html
new file mode 100644 (file)
index 0000000..55679f8
--- /dev/null
@@ -0,0 +1,2279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript</title>\r
+               <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+               <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+               <meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+               <script type="text/javascript">var isIe = false, isIePre7 = false;</script>\r
+               <!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->\r
+               <!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->\r
+               <script type="text/javascript">\r
+                       //<![CDATA[\r
+                       var loggingEnabled = true;\r
+                       var logQueuedEventsTimer = null;\r
+                       var logEntries = [];\r
+                       var logEntriesAndSeparators = [];\r
+                       var logItems = [];\r
+                       var renderDelay = 100;\r
+                       var unrenderedLogItemsExist = false;\r
+                       var rootGroup, currentGroup = null;\r
+                       var loaded = false;\r
+                       var currentLogItem = null;\r
+                       var logMainContainer;\r
+\r
+                       function copyProperties(obj, props) {\r
+                               for (var i in props) {\r
+                                       obj[i] = props[i];\r
+                               }\r
+                       }\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItem() {\r
+                       }\r
+\r
+                       LogItem.prototype = {\r
+                               mainContainer: null,\r
+                               wrappedContainer: null,\r
+                               unwrappedContainer: null,\r
+                               group: null,\r
+\r
+                               appendToLog: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].appendToLog();\r
+                                       }\r
+                                       this.group.update();\r
+                               },\r
+\r
+                               doRemove: function(doUpdate, removeFromGroup) {\r
+                                       if (this.rendered) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].remove();\r
+                                               }\r
+                                               this.unwrappedElementContainer = null;\r
+                                               this.wrappedElementContainer = null;\r
+                                               this.mainElementContainer = null;\r
+                                       }\r
+                                       if (this.group && removeFromGroup) {\r
+                                               this.group.removeChild(this, doUpdate);\r
+                                       }\r
+                                       if (this === currentLogItem) {\r
+                                               currentLogItem = null;\r
+                                       }\r
+                               },\r
+\r
+                               remove: function(doUpdate, removeFromGroup) {\r
+                                       this.doRemove(doUpdate, removeFromGroup);\r
+                               },\r
+\r
+                               render: function() {},\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visit(this);\r
+                               },\r
+\r
+                               getUnwrappedDomContainer: function() {\r
+                                       return this.group.unwrappedElementContainer.contentDiv;\r
+                               },\r
+\r
+                               getWrappedDomContainer: function() {\r
+                                       return this.group.wrappedElementContainer.contentDiv;\r
+                               },\r
+\r
+                               getMainDomContainer: function() {\r
+                                       return this.group.mainElementContainer.contentDiv;\r
+                               }\r
+                       };\r
+\r
+                       LogItem.serializedItemKeys = {LOG_ENTRY: 0, GROUP_START: 1, GROUP_END: 2};\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemContainerElement() {\r
+                       }\r
+\r
+                       LogItemContainerElement.prototype = {\r
+                               appendToLog: function() {\r
+                                       var insertBeforeFirst = (newestAtTop && this.containerDomNode.hasChildNodes());\r
+                                       if (insertBeforeFirst) {\r
+                                               this.containerDomNode.insertBefore(this.mainDiv, this.containerDomNode.firstChild);\r
+                                       } else {\r
+                                               this.containerDomNode.appendChild(this.mainDiv);\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function SeparatorElementContainer(containerDomNode) {\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "separator";\r
+                               this.mainDiv.innerHTML = "&nbsp;";\r
+                       }\r
+\r
+                       SeparatorElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       SeparatorElementContainer.prototype.remove = function() {\r
+                               this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                               this.mainDiv = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function Separator() {\r
+                               this.rendered = false;\r
+                       }\r
+\r
+                       Separator.prototype = new LogItem();\r
+\r
+                       copyProperties(Separator.prototype, {\r
+                               render: function() {\r
+                                       var containerDomNode = this.group.contentDiv;\r
+                                       if (isIe) {\r
+                                               this.unwrappedElementContainer = new SeparatorElementContainer(this.getUnwrappedDomContainer());\r
+                                               this.wrappedElementContainer = new SeparatorElementContainer(this.getWrappedDomContainer());\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               this.mainElementContainer = new SeparatorElementContainer(this.getMainDomContainer());\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.content = this.formattedMessage;\r
+                                       this.rendered = true;\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function GroupElementContainer(group, containerDomNode, isRoot, isWrapped) {\r
+                               this.group = group;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.isRoot = isRoot;\r
+                               this.isWrapped = isWrapped;\r
+                               this.expandable = false;\r
+\r
+                               if (this.isRoot) {\r
+                                       if (isIe) {\r
+                                               this.contentDiv = logMainContainer.appendChild(document.createElement("div"));\r
+                                               this.contentDiv.id = this.isWrapped ? "log_wrapped" : "log_unwrapped";\r
+                                       } else {\r
+                                               this.contentDiv = logMainContainer;\r
+                                       }\r
+                               } else {\r
+                                       var groupElementContainer = this;\r
+                                       \r
+                                       this.mainDiv = document.createElement("div");\r
+                                       this.mainDiv.className = "group";\r
+\r
+                                       this.headingDiv = this.mainDiv.appendChild(document.createElement("div"));\r
+                                       this.headingDiv.className = "groupheading";\r
+\r
+                                       this.expander = this.headingDiv.appendChild(document.createElement("span"));\r
+                                       this.expander.className = "expander unselectable greyedout";\r
+                                       this.expander.unselectable = true;\r
+                                       var expanderText = this.group.expanded ? "-" : "+";\r
+                                       this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));\r
+                                       \r
+                                       this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));\r
+\r
+                                       this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));\r
+                                       var contentCssClass = this.group.expanded ? "expanded" : "collapsed";\r
+                                       this.contentDiv.className = "groupcontent " + contentCssClass;\r
+\r
+                                       this.expander.onclick = function() {\r
+                                               if (groupElementContainer.group.expandable) {\r
+                                                       groupElementContainer.group.toggleExpanded();\r
+                                               }\r
+                                       };\r
+                               }\r
+                       }\r
+\r
+                       GroupElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       copyProperties(GroupElementContainer.prototype, {\r
+                               toggleExpanded: function() {\r
+                                       if (!this.isRoot) {\r
+                                               var oldCssClass, newCssClass, expanderText;\r
+                                               if (this.group.expanded) {\r
+                                                       newCssClass = "expanded";\r
+                                                       oldCssClass = "collapsed";\r
+                                                       expanderText = "-";\r
+                                               } else {\r
+                                                       newCssClass = "collapsed";\r
+                                                       oldCssClass = "expanded";\r
+                                                       expanderText = "+";\r
+                                               }\r
+                                               replaceClass(this.contentDiv, newCssClass, oldCssClass);\r
+                                               this.expanderTextNode.nodeValue = expanderText;\r
+                                       }\r
+                               },\r
+\r
+                               remove: function() {\r
+                                       if (!this.isRoot) {\r
+                                               this.headingDiv = null;\r
+                                               this.expander.onclick = null;\r
+                                               this.expander = null;\r
+                                               this.expanderTextNode = null;\r
+                                               this.contentDiv = null;\r
+                                               this.containerDomNode = null;\r
+                                               this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                                               this.mainDiv = null;\r
+                                       }\r
+                               },\r
+\r
+                               reverseChildren: function() {\r
+                                       // Invert the order of the log entries\r
+                                       var node = null;\r
+\r
+                                       // Remove all the log container nodes\r
+                                       var childDomNodes = [];\r
+                                       while ((node = this.contentDiv.firstChild)) {\r
+                                               this.contentDiv.removeChild(node);\r
+                                               childDomNodes.push(node);\r
+                                       }\r
+\r
+                                       // Put them all back in reverse order\r
+                                       while ((node = childDomNodes.pop())) {\r
+                                               this.contentDiv.appendChild(node);\r
+                                       }\r
+                               },\r
+\r
+                               update: function() {\r
+                                       if (!this.isRoot) {\r
+                                               if (this.group.expandable) {\r
+                                                       removeClass(this.expander, "greyedout");\r
+                                               } else {\r
+                                                       addClass(this.expander, "greyedout");\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               clear: function() {\r
+                                       if (this.isRoot) {\r
+                                               this.contentDiv.innerHTML = "";\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function Group(name, isRoot, initiallyExpanded) {\r
+                               this.name = name;\r
+                               this.group = null;\r
+                               this.isRoot = isRoot;\r
+                               this.initiallyExpanded = initiallyExpanded;\r
+                               this.elementContainers = [];\r
+                               this.children = [];\r
+                               this.expanded = initiallyExpanded;\r
+                               this.rendered = false;\r
+                               this.expandable = false;\r
+                       }\r
+\r
+                       Group.prototype = new LogItem();\r
+\r
+                       copyProperties(Group.prototype, {\r
+                               addChild: function(logItem) {\r
+                                       this.children.push(logItem);\r
+                                       logItem.group = this;\r
+                               },\r
+\r
+                               render: function() {\r
+                                       if (isIe) {\r
+                                               var unwrappedDomContainer, wrappedDomContainer;\r
+                                               if (this.isRoot) {\r
+                                                       unwrappedDomContainer = logMainContainer;\r
+                                                       wrappedDomContainer = logMainContainer;\r
+                                               } else {\r
+                                                       unwrappedDomContainer = this.getUnwrappedDomContainer();\r
+                                                       wrappedDomContainer = this.getWrappedDomContainer();\r
+                                               }\r
+                                               this.unwrappedElementContainer = new GroupElementContainer(this, unwrappedDomContainer, this.isRoot, false);\r
+                                               this.wrappedElementContainer = new GroupElementContainer(this, wrappedDomContainer, this.isRoot, true);\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               var mainDomContainer = this.isRoot ? logMainContainer : this.getMainDomContainer();\r
+                                               this.mainElementContainer = new GroupElementContainer(this, mainDomContainer, this.isRoot, false);\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.rendered = true;\r
+                               },\r
+\r
+                               toggleExpanded: function() {\r
+                                       this.expanded = !this.expanded;\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].toggleExpanded();\r
+                                       }\r
+                               },\r
+\r
+                               expand: function() {\r
+                                       if (!this.expanded) {\r
+                                               this.toggleExpanded();\r
+                                       }\r
+                               },\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visitGroup(this);\r
+                               },\r
+\r
+                               reverseChildren: function() {\r
+                                       if (this.rendered) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].reverseChildren();\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               update: function() {\r
+                                       var previouslyExpandable = this.expandable;\r
+                                       this.expandable = (this.children.length !== 0);\r
+                                       if (this.expandable !== previouslyExpandable) {\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].update();\r
+                                               }\r
+                                       }\r
+                               },\r
+\r
+                               flatten: function() {\r
+                                       var visitor = new GroupFlattener();\r
+                                       this.accept(visitor);\r
+                                       return visitor.logEntriesAndSeparators;\r
+                               },\r
+\r
+                               removeChild: function(child, doUpdate) {\r
+                                       array_remove(this.children, child);\r
+                                       child.group = null;\r
+                                       if (doUpdate) {\r
+                                               this.update();\r
+                                       }\r
+                               },\r
+\r
+                               remove: function(doUpdate, removeFromGroup) {\r
+                                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                                               this.children[i].remove(false, false);\r
+                                       }\r
+                                       this.children = [];\r
+                                       this.update();\r
+                                       if (this === currentGroup) {\r
+                                               currentGroup = this.group;\r
+                                       }\r
+                                       this.doRemove(doUpdate, removeFromGroup);\r
+                               },\r
+\r
+                               serialize: function(items) {\r
+                                       items.push([LogItem.serializedItemKeys.GROUP_START, this.name]);\r
+                                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                                               this.children[i].serialize(items);\r
+                                       }\r
+                                       if (this !== currentGroup) {\r
+                                               items.push([LogItem.serializedItemKeys.GROUP_END]);\r
+                                       }\r
+                               },\r
+\r
+                               clear: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].clear();\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryElementContainer() {\r
+                       }\r
+\r
+                       LogEntryElementContainer.prototype = new LogItemContainerElement();\r
+\r
+                       copyProperties(LogEntryElementContainer.prototype, {\r
+                               remove: function() {\r
+                                       this.doRemove();\r
+                               },\r
+\r
+                               doRemove: function() {\r
+                                       this.mainDiv.parentNode.removeChild(this.mainDiv);\r
+                                       this.mainDiv = null;\r
+                                       this.contentElement = null;\r
+                                       this.containerDomNode = null;\r
+                               },\r
+\r
+                               setContent: function(content, wrappedContent) {\r
+                                       if (content === this.formattedMessage) {\r
+                                               this.contentElement.innerHTML = "";\r
+                                               this.contentElement.appendChild(document.createTextNode(this.formattedMessage));\r
+                                       } else {\r
+                                               this.contentElement.innerHTML = content;\r
+                                       }\r
+                               },\r
+\r
+                               setSearchMatch: function(isMatch) {\r
+                                       var oldCssClass = isMatch ? "searchnonmatch" : "searchmatch";\r
+                                       var newCssClass = isMatch ? "searchmatch" : "searchnonmatch";\r
+                                       replaceClass(this.mainDiv, newCssClass, oldCssClass);\r
+                               },\r
+\r
+                               clearSearch: function() {\r
+                                       removeClass(this.mainDiv, "searchmatch");\r
+                                       removeClass(this.mainDiv, "searchnonmatch");\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryWrappedElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                               this.mainDiv.className = "logentry wrapped " + this.logEntry.level;\r
+                               this.contentElement = this.mainDiv;\r
+                       }\r
+\r
+                       LogEntryWrappedElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       LogEntryWrappedElementContainer.prototype.setContent = function(content, wrappedContent) {\r
+                               if (content === this.formattedMessage) {\r
+                                       this.contentElement.innerHTML = "";\r
+                                       this.contentElement.appendChild(document.createTextNode(this.formattedMessage));\r
+                               } else {\r
+                                       this.contentElement.innerHTML = wrappedContent;\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryUnwrappedElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "logentry unwrapped " + this.logEntry.level;\r
+                               this.pre = this.mainDiv.appendChild(document.createElement("pre"));\r
+                               this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                               this.pre.className = "unwrapped";\r
+                               this.contentElement = this.pre;\r
+                       }\r
+\r
+                       LogEntryUnwrappedElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       LogEntryUnwrappedElementContainer.prototype.remove = function() {\r
+                               this.doRemove();\r
+                               this.pre = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntryMainElementContainer(logEntry, containerDomNode) {\r
+                               this.logEntry = logEntry;\r
+                               this.containerDomNode = containerDomNode;\r
+                               this.mainDiv = document.createElement("div");\r
+                               this.mainDiv.className = "logentry nonielogentry " + this.logEntry.level;\r
+                               this.contentElement = this.mainDiv.appendChild(document.createElement("span"));\r
+                               this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));\r
+                       }\r
+\r
+                       LogEntryMainElementContainer.prototype = new LogEntryElementContainer();\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogEntry(level, formattedMessage) {\r
+                               this.level = level;\r
+                               this.formattedMessage = formattedMessage;\r
+                               this.rendered = false;\r
+                       }\r
+\r
+                       LogEntry.prototype = new LogItem();\r
+\r
+                       copyProperties(LogEntry.prototype, {\r
+                               render: function() {\r
+                                       var logEntry = this;\r
+                                       var containerDomNode = this.group.contentDiv;\r
+\r
+                                       // Support for the CSS attribute white-space in IE for Windows is\r
+                                       // non-existent pre version 6 and slightly odd in 6, so instead\r
+                                       // use two different HTML elements\r
+                                       if (isIe) {\r
+                                               this.formattedMessage = this.formattedMessage.replace(/\r\n/g, "\r"); // Workaround for IE's treatment of white space\r
+                                               this.unwrappedElementContainer = new LogEntryUnwrappedElementContainer(this, this.getUnwrappedDomContainer());\r
+                                               this.wrappedElementContainer = new LogEntryWrappedElementContainer(this, this.getWrappedDomContainer());\r
+                                               this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];\r
+                                       } else {\r
+                                               this.mainElementContainer = new LogEntryMainElementContainer(this, this.getMainDomContainer());\r
+                                               this.elementContainers = [this.mainElementContainer];\r
+                                       }\r
+                                       this.content = this.formattedMessage;\r
+                                       this.rendered = true;\r
+                               },\r
+\r
+                               setContent: function(content, wrappedContent) {\r
+                                       if (content != this.content) {\r
+                                               if (isIe && (content !== this.formattedMessage)) {\r
+                                                       content = content.replace(/\r\n/g, "\r"); // Workaround for IE's treatment of white space\r
+                                               }\r
+                                               for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                                       this.elementContainers[i].setContent(content, wrappedContent);\r
+                                               }\r
+                                               this.content = content;\r
+                                       }\r
+                               },\r
+\r
+                               getSearchMatches: function() {\r
+                                       var matches = [];\r
+                                       var i, len;\r
+                                       if (isIe) {\r
+                                               var unwrappedEls = getElementsByClass(this.unwrappedElementContainer.mainDiv, "searchterm", "span");\r
+                                               var wrappedEls = getElementsByClass(this.wrappedElementContainer.mainDiv, "searchterm", "span");\r
+                                               for (i = 0, len = unwrappedEls.length; i < len; i++) {\r
+                                                       matches[i] = new Match(this.level, null, unwrappedEls[i], wrappedEls[i]);\r
+                                               }\r
+                                       } else {\r
+                                               var els = getElementsByClass(this.mainElementContainer.mainDiv, "searchterm", "span");\r
+                                               for (i = 0, len = els.length; i < len; i++) {\r
+                                                       matches[i] = new Match(this.level, els[i]);\r
+                                               }\r
+                                       }\r
+                                       return matches;\r
+                               },\r
+\r
+                               setSearchMatch: function(isMatch) {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].setSearchMatch(isMatch);\r
+                                       }\r
+                               },\r
+\r
+                               clearSearch: function() {\r
+                                       for (var i = 0, len = this.elementContainers.length; i < len; i++) {\r
+                                               this.elementContainers[i].clearSearch();\r
+                                       }\r
+                               },\r
+\r
+                               accept: function(visitor) {\r
+                                       visitor.visitLogEntry(this);\r
+                               },\r
+\r
+                               serialize: function(items) {\r
+                                       items.push([LogItem.serializedItemKeys.LOG_ENTRY, this.level, this.formattedMessage]);\r
+                               }\r
+                       });\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemVisitor() {\r
+                       }\r
+\r
+                       LogItemVisitor.prototype = {\r
+                               visit: function(logItem) {\r
+                               },\r
+\r
+                               visitParent: function(logItem) {\r
+                                       if (logItem.group) {\r
+                                               logItem.group.accept(this);\r
+                                       }\r
+                               },\r
+\r
+                               visitChildren: function(logItem) {\r
+                                       for (var i = 0, len = logItem.children.length; i < len; i++) {\r
+                                               logItem.children[i].accept(this);\r
+                                       }\r
+                               },\r
+\r
+                               visitLogEntry: function(logEntry) {\r
+                                       this.visit(logEntry);\r
+                               },\r
+\r
+                               visitSeparator: function(separator) {\r
+                                       this.visit(separator);\r
+                               },\r
+\r
+                               visitGroup: function(group) {\r
+                                       this.visit(group);\r
+                               }\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function GroupFlattener() {\r
+                               this.logEntriesAndSeparators = [];\r
+                       }\r
+\r
+                       GroupFlattener.prototype = new LogItemVisitor();\r
+\r
+                       GroupFlattener.prototype.visitGroup = function(group) {\r
+                               this.visitChildren(group);\r
+                       };\r
+\r
+                       GroupFlattener.prototype.visitLogEntry = function(logEntry) {\r
+                               this.logEntriesAndSeparators.push(logEntry);\r
+                       };\r
+\r
+                       GroupFlattener.prototype.visitSeparator = function(separator) {\r
+                               this.logEntriesAndSeparators.push(separator);\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       window.onload = function() {\r
+                               // Sort out document.domain\r
+                               if (location.search) {\r
+                                       var queryBits = unescape(location.search).substr(1).split("&"), nameValueBits;\r
+                                       for (var i = 0, len = queryBits.length; i < len; i++) {\r
+                                               nameValueBits = queryBits[i].split("=");\r
+                                               if (nameValueBits[0] == "log4javascript_domain") {\r
+                                                       document.domain = nameValueBits[1];\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Create DOM objects\r
+                               logMainContainer = $("log");\r
+                               if (isIePre7) {\r
+                                       addClass(logMainContainer, "oldIe");\r
+                               }\r
+\r
+                               rootGroup = new Group("root", true);\r
+                               rootGroup.render();\r
+                               currentGroup = rootGroup;\r
+                               \r
+                               setCommandInputWidth();\r
+                               setLogContainerHeight();\r
+                               toggleLoggingEnabled();\r
+                               toggleSearchEnabled();\r
+                               toggleSearchFilter();\r
+                               toggleSearchHighlight();\r
+                               applyFilters();\r
+                               checkAllLevels();\r
+                               toggleWrap();\r
+                               toggleNewestAtTop();\r
+                               toggleScrollToLatest();\r
+                               renderQueuedLogItems();\r
+                               loaded = true;\r
+                               $("command").value = "";\r
+                               $("command").autocomplete = "off";\r
+                               $("command").onkeydown = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 10 || evt.keyCode == 13) { // Return/Enter\r
+                                               evalCommandLine();\r
+                                               stopPropagation(evt);\r
+                                       } else if (evt.keyCode == 27) { // Escape\r
+                                               this.value = "";\r
+                                               this.focus();\r
+                                       } else if (evt.keyCode == 38 && commandHistory.length > 0) { // Up\r
+                                               currentCommandIndex = Math.max(0, currentCommandIndex - 1);\r
+                                               this.value = commandHistory[currentCommandIndex];\r
+                                               moveCaretToEnd(this);\r
+                                       } else if (evt.keyCode == 40 && commandHistory.length > 0) { // Down\r
+                                               currentCommandIndex = Math.min(commandHistory.length - 1, currentCommandIndex + 1);\r
+                                               this.value = commandHistory[currentCommandIndex];\r
+                                               moveCaretToEnd(this);\r
+                                       }\r
+                               };\r
+\r
+                               // Prevent the keypress moving the caret in Firefox\r
+                               $("command").onkeypress = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 38 && commandHistory.length > 0 && evt.preventDefault) { // Up\r
+                                               evt.preventDefault();\r
+                                       }\r
+                               };\r
+\r
+                               // Prevent the keyup event blurring the input in Opera\r
+                               $("command").onkeyup = function(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       if (evt.keyCode == 27 && evt.preventDefault) { // Up\r
+                                               evt.preventDefault();\r
+                                               this.focus();\r
+                                       }\r
+                               };\r
+\r
+                               // Add document keyboard shortcuts\r
+                               document.onkeydown = function keyEventHandler(evt) {\r
+                                       evt = getEvent(evt);\r
+                                       switch (evt.keyCode) {\r
+                                               case 69: // Ctrl + shift + E: re-execute last command\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               evalLastCommand();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                               case 75: // Ctrl + shift + K: focus search\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               focusSearch();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                               case 40: // Ctrl + shift + down arrow: focus command line\r
+                                               case 76: // Ctrl + shift + L: focus command line\r
+                                                       if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {\r
+                                                               focusCommandLine();\r
+                                                               cancelKeyEvent(evt);\r
+                                                               return false;\r
+                                                       }\r
+                                                       break;\r
+                                       }\r
+                               };\r
+\r
+                               // Workaround to make sure log div starts at the correct size\r
+                               setTimeout(setLogContainerHeight, 20);\r
+\r
+                               setShowCommandLine(showCommandLine);\r
+                               doSearch();\r
+                       };\r
+\r
+                       window.onunload = function() {\r
+                               if (mainWindowExists()) {\r
+                                       appender.unload();\r
+                               }\r
+                               appender = null;\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function toggleLoggingEnabled() {\r
+                               setLoggingEnabled($("enableLogging").checked);\r
+                       }\r
+\r
+                       function setLoggingEnabled(enable) {\r
+                               loggingEnabled = enable;\r
+                       }\r
+\r
+                       var appender = null;\r
+\r
+                       function setAppender(appenderParam) {\r
+                               appender = appenderParam;\r
+                       }\r
+\r
+                       function setShowCloseButton(showCloseButton) {\r
+                               $("closeButton").style.display = showCloseButton ? "inline" : "none";\r
+                       }\r
+\r
+                       function setShowHideButton(showHideButton) {\r
+                               $("hideButton").style.display = showHideButton ? "inline" : "none";\r
+                       }\r
+\r
+                       var newestAtTop = false;\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function LogItemContentReverser() {\r
+                       }\r
+                       \r
+                       LogItemContentReverser.prototype = new LogItemVisitor();\r
+                       \r
+                       LogItemContentReverser.prototype.visitGroup = function(group) {\r
+                               group.reverseChildren();\r
+                               this.visitChildren(group);\r
+                       };\r
+\r
+                       /*----------------------------------------------------------------*/\r
+\r
+                       function setNewestAtTop(isNewestAtTop) {\r
+                               var oldNewestAtTop = newestAtTop;\r
+                               var i, iLen, j, jLen;\r
+                               newestAtTop = Boolean(isNewestAtTop);\r
+                               if (oldNewestAtTop != newestAtTop) {\r
+                                       var visitor = new LogItemContentReverser();\r
+                                       rootGroup.accept(visitor);\r
+\r
+                                       // Reassemble the matches array\r
+                                       if (currentSearch) {\r
+                                               var currentMatch = currentSearch.matches[currentMatchIndex];\r
+                                               var matchIndex = 0;\r
+                                               var matches = [];\r
+                                               var actOnLogEntry = function(logEntry) {\r
+                                                       var logEntryMatches = logEntry.getSearchMatches();\r
+                                                       for (j = 0, jLen = logEntryMatches.length; j < jLen; j++) {\r
+                                                               matches[matchIndex] = logEntryMatches[j];\r
+                                                               if (currentMatch && logEntryMatches[j].equals(currentMatch)) {\r
+                                                                       currentMatchIndex = matchIndex;\r
+                                                               }\r
+                                                               matchIndex++;\r
+                                                       }\r
+                                               };\r
+                                               if (newestAtTop) {\r
+                                                       for (i = logEntries.length - 1; i >= 0; i--) {\r
+                                                               actOnLogEntry(logEntries[i]);\r
+                                                       }\r
+                                               } else {\r
+                                                       for (i = 0, iLen = logEntries.length; i < iLen; i++) {\r
+                                                               actOnLogEntry(logEntries[i]);\r
+                                                       }\r
+                                               }\r
+                                               currentSearch.matches = matches;\r
+                                               if (currentMatch) {\r
+                                                       currentMatch.setCurrent();\r
+                                               }\r
+                                       } else if (scrollToLatest) {\r
+                                               doScrollToLatest();\r
+                                       }\r
+                               }\r
+                               $("newestAtTop").checked = isNewestAtTop;\r
+                       }\r
+\r
+                       function toggleNewestAtTop() {\r
+                               var isNewestAtTop = $("newestAtTop").checked;\r
+                               setNewestAtTop(isNewestAtTop);\r
+                       }\r
+\r
+                       var scrollToLatest = true;\r
+\r
+                       function setScrollToLatest(isScrollToLatest) {\r
+                               scrollToLatest = isScrollToLatest;\r
+                               if (scrollToLatest) {\r
+                                       doScrollToLatest();\r
+                               }\r
+                               $("scrollToLatest").checked = isScrollToLatest;\r
+                       }\r
+\r
+                       function toggleScrollToLatest() {\r
+                               var isScrollToLatest = $("scrollToLatest").checked;\r
+                               setScrollToLatest(isScrollToLatest);\r
+                       }\r
+\r
+                       function doScrollToLatest() {\r
+                               var l = logMainContainer;\r
+                               if (typeof l.scrollTop != "undefined") {\r
+                                       if (newestAtTop) {\r
+                                               l.scrollTop = 0;\r
+                                       } else {\r
+                                               var latestLogEntry = l.lastChild;\r
+                                               if (latestLogEntry) {\r
+                                                       l.scrollTop = l.scrollHeight;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       var closeIfOpenerCloses = true;\r
+\r
+                       function setCloseIfOpenerCloses(isCloseIfOpenerCloses) {\r
+                               closeIfOpenerCloses = isCloseIfOpenerCloses;\r
+                       }\r
+\r
+                       var maxMessages = null;\r
+\r
+                       function setMaxMessages(max) {\r
+                               maxMessages = max;\r
+                               pruneLogEntries();\r
+                       }\r
+\r
+                       var showCommandLine = false;\r
+\r
+                       function setShowCommandLine(isShowCommandLine) {\r
+                               showCommandLine = isShowCommandLine;\r
+                               if (loaded) {\r
+                                       $("commandLine").style.display = showCommandLine ? "block" : "none";\r
+                                       setCommandInputWidth();\r
+                                       setLogContainerHeight();\r
+                               }\r
+                       }\r
+\r
+                       function focusCommandLine() {\r
+                               if (loaded) {\r
+                                       $("command").focus();\r
+                               }\r
+                       }\r
+\r
+                       function focusSearch() {\r
+                               if (loaded) {\r
+                                       $("searchBox").focus();\r
+                               }\r
+                       }\r
+\r
+                       function getLogItems() {\r
+                               var items = [];\r
+                               for (var i = 0, len = logItems.length; i < len; i++) {\r
+                                       logItems[i].serialize(items);\r
+                               }\r
+                               return items;\r
+                       }\r
+\r
+                       function setLogItems(items) {\r
+                               var loggingReallyEnabled = loggingEnabled;\r
+                               // Temporarily turn logging on\r
+                               loggingEnabled = true;\r
+                               for (var i = 0, len = items.length; i < len; i++) {\r
+                                       switch (items[i][0]) {\r
+                                               case LogItem.serializedItemKeys.LOG_ENTRY:\r
+                                                       log(items[i][1], items[i][2]);\r
+                                                       break;\r
+                                               case LogItem.serializedItemKeys.GROUP_START:\r
+                                                       group(items[i][1]);\r
+                                                       break;\r
+                                               case LogItem.serializedItemKeys.GROUP_END:\r
+                                                       groupEnd();\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               loggingEnabled = loggingReallyEnabled;\r
+                       }\r
+\r
+                       function log(logLevel, formattedMessage) {\r
+                               if (loggingEnabled) {\r
+                                       var logEntry = new LogEntry(logLevel, formattedMessage);\r
+                                       logEntries.push(logEntry);\r
+                                       logEntriesAndSeparators.push(logEntry);\r
+                                       logItems.push(logEntry);\r
+                                       currentGroup.addChild(logEntry);\r
+                                       if (loaded) {\r
+                                               if (logQueuedEventsTimer !== null) {\r
+                                                       clearTimeout(logQueuedEventsTimer);\r
+                                               }\r
+                                               logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);\r
+                                               unrenderedLogItemsExist = true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function renderQueuedLogItems() {\r
+                               logQueuedEventsTimer = null;\r
+                               var pruned = pruneLogEntries();\r
+\r
+                               // Render any unrendered log entries and apply the current search to them\r
+                               var initiallyHasMatches = currentSearch ? currentSearch.hasMatches() : false;\r
+                               for (var i = 0, len = logItems.length; i < len; i++) {\r
+                                       if (!logItems[i].rendered) {\r
+                                               logItems[i].render();\r
+                                               logItems[i].appendToLog();\r
+                                               if (currentSearch && (logItems[i] instanceof LogEntry)) {\r
+                                                       currentSearch.applyTo(logItems[i]);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if (currentSearch) {\r
+                                       if (pruned) {\r
+                                               if (currentSearch.hasVisibleMatches()) {\r
+                                                       if (currentMatchIndex === null) {\r
+                                                               setCurrentMatchIndex(0);\r
+                                                       }\r
+                                                       displayMatches();\r
+                                               } else {\r
+                                                       displayNoMatches();\r
+                                               }\r
+                                       } else if (!initiallyHasMatches && currentSearch.hasVisibleMatches()) {\r
+                                               setCurrentMatchIndex(0);\r
+                                               displayMatches();\r
+                                       }\r
+                               }\r
+                               if (scrollToLatest) {\r
+                                       doScrollToLatest();\r
+                               }\r
+                               unrenderedLogItemsExist = false;\r
+                       }\r
+\r
+                       function pruneLogEntries() {\r
+                               if ((maxMessages !== null) && (logEntriesAndSeparators.length > maxMessages)) {\r
+                                       var numberToDelete = logEntriesAndSeparators.length - maxMessages;\r
+                                       var prunedLogEntries = logEntriesAndSeparators.slice(0, numberToDelete);\r
+                                       if (currentSearch) {\r
+                                               currentSearch.removeMatches(prunedLogEntries);\r
+                                       }\r
+                                       var group;\r
+                                       for (var i = 0; i < numberToDelete; i++) {\r
+                                               group = logEntriesAndSeparators[i].group;\r
+                                               array_remove(logItems, logEntriesAndSeparators[i]);\r
+                                               array_remove(logEntries, logEntriesAndSeparators[i]);\r
+                                               logEntriesAndSeparators[i].remove(true, true);\r
+                                               if (group.children.length === 0 && group !== currentGroup && group !== rootGroup) {\r
+                                                       array_remove(logItems, group);\r
+                                                       group.remove(true, true);\r
+                                               }\r
+                                       }\r
+                                       logEntriesAndSeparators = array_removeFromStart(logEntriesAndSeparators, numberToDelete);\r
+                                       return true;\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function group(name, startExpanded) {\r
+                               if (loggingEnabled) {\r
+                                       initiallyExpanded = (typeof startExpanded === "undefined") ? true : Boolean(startExpanded);\r
+                                       var newGroup = new Group(name, false, initiallyExpanded);\r
+                                       currentGroup.addChild(newGroup);\r
+                                       currentGroup = newGroup;\r
+                                       logItems.push(newGroup);\r
+                                       if (loaded) {\r
+                                               if (logQueuedEventsTimer !== null) {\r
+                                                       clearTimeout(logQueuedEventsTimer);\r
+                                               }\r
+                                               logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);\r
+                                               unrenderedLogItemsExist = true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function groupEnd() {\r
+                               currentGroup = (currentGroup === rootGroup) ? rootGroup : currentGroup.group;\r
+                       }\r
+\r
+                       function mainPageReloaded() {\r
+                               currentGroup = rootGroup;\r
+                               var separator = new Separator();\r
+                               logEntriesAndSeparators.push(separator);\r
+                               logItems.push(separator);\r
+                               currentGroup.addChild(separator);\r
+                       }\r
+\r
+                       function closeWindow() {\r
+                               if (appender && mainWindowExists()) {\r
+                                       appender.close(true);\r
+                               } else {\r
+                                       window.close();\r
+                               }\r
+                       }\r
+\r
+                       function hide() {\r
+                               if (appender && mainWindowExists()) {\r
+                                       appender.hide();\r
+                               }\r
+                       }\r
+\r
+                       var mainWindow = window;\r
+                       var windowId = "log4javascriptConsoleWindow_" + new Date().getTime() + "_" + ("" + Math.random()).substr(2);\r
+\r
+                       function setMainWindow(win) {\r
+                               mainWindow = win;\r
+                               mainWindow[windowId] = window;\r
+                               // If this is a pop-up, poll the opener to see if it's closed\r
+                               if (opener && closeIfOpenerCloses) {\r
+                                       pollOpener();\r
+                               }\r
+                       }\r
+\r
+                       function pollOpener() {\r
+                               if (closeIfOpenerCloses) {\r
+                                       if (mainWindowExists()) {\r
+                                               setTimeout(pollOpener, 500);\r
+                                       } else {\r
+                                               closeWindow();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function mainWindowExists() {\r
+                               try {\r
+                                       return (mainWindow && !mainWindow.closed &&\r
+                                               mainWindow[windowId] == window);\r
+                               } catch (ex) {}\r
+                               return false;\r
+                       }\r
+\r
+                       var logLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];\r
+\r
+                       function getCheckBox(logLevel) {\r
+                               return $("switch_" + logLevel);\r
+                       }\r
+\r
+                       function getIeWrappedLogContainer() {\r
+                               return $("log_wrapped");\r
+                       }\r
+\r
+                       function getIeUnwrappedLogContainer() {\r
+                               return $("log_unwrapped");\r
+                       }\r
+\r
+                       function applyFilters() {\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       if (getCheckBox(logLevels[i]).checked) {\r
+                                               addClass(logMainContainer, logLevels[i]);\r
+                                       } else {\r
+                                               removeClass(logMainContainer, logLevels[i]);\r
+                                       }\r
+                               }\r
+                               updateSearchFromFilters();\r
+                       }\r
+\r
+                       function toggleAllLevels() {\r
+                               var turnOn = $("switch_ALL").checked;\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       getCheckBox(logLevels[i]).checked = turnOn;\r
+                                       if (turnOn) {\r
+                                               addClass(logMainContainer, logLevels[i]);\r
+                                       } else {\r
+                                               removeClass(logMainContainer, logLevels[i]);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function checkAllLevels() {\r
+                               for (var i = 0; i < logLevels.length; i++) {\r
+                                       if (!getCheckBox(logLevels[i]).checked) {\r
+                                               getCheckBox("ALL").checked = false;\r
+                                               return;\r
+                                       }\r
+                               }\r
+                               getCheckBox("ALL").checked = true;\r
+                       }\r
+\r
+                       function clearLog() {\r
+                               rootGroup.clear();\r
+                               currentGroup = rootGroup;\r
+                               logEntries = [];\r
+                               logItems = [];\r
+                               logEntriesAndSeparators = [];\r
+                               doSearch();\r
+                       }\r
+\r
+                       function toggleWrap() {\r
+                               var enable = $("wrap").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "wrap");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "wrap");\r
+                               }\r
+                               refreshCurrentMatch();\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------- */\r
+\r
+                       // Search\r
+\r
+                       var searchTimer = null;\r
+\r
+                       function scheduleSearch() {\r
+                               try {\r
+                                       clearTimeout(searchTimer);\r
+                               } catch (ex) {\r
+                                       // Do nothing\r
+                               }\r
+                               searchTimer = setTimeout(doSearch, 500);\r
+                       }\r
+\r
+                       function Search(searchTerm, isRegex, searchRegex, isCaseSensitive) {\r
+                               this.searchTerm = searchTerm;\r
+                               this.isRegex = isRegex;\r
+                               this.searchRegex = searchRegex;\r
+                               this.isCaseSensitive = isCaseSensitive;\r
+                               this.matches = [];\r
+                       }\r
+\r
+                       Search.prototype = {\r
+                               hasMatches: function() {\r
+                                       return this.matches.length > 0;\r
+                               },\r
+\r
+                               hasVisibleMatches: function() {\r
+                                       if (this.hasMatches()) {\r
+                                               for (var i = 0; i < this.matches.length; i++) {\r
+                                                       if (this.matches[i].isVisible()) {\r
+                                                               return true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       return false;\r
+                               },\r
+\r
+                               match: function(logEntry) {\r
+                                       var entryText = String(logEntry.formattedMessage);\r
+                                       var matchesSearch = false;\r
+                                       if (this.isRegex) {\r
+                                               matchesSearch = this.searchRegex.test(entryText);\r
+                                       } else if (this.isCaseSensitive) {\r
+                                               matchesSearch = (entryText.indexOf(this.searchTerm) > -1);\r
+                                       } else {\r
+                                               matchesSearch = (entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);\r
+                                       }\r
+                                       return matchesSearch;\r
+                               },\r
+\r
+                               getNextVisibleMatchIndex: function() {\r
+                                       for (var i = currentMatchIndex + 1; i < this.matches.length; i++) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       // Start again from the first match\r
+                                       for (i = 0; i <= currentMatchIndex; i++) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       return -1;\r
+                               },\r
+\r
+                               getPreviousVisibleMatchIndex: function() {\r
+                                       for (var i = currentMatchIndex - 1; i >= 0; i--) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       // Start again from the last match\r
+                                       for (var i = this.matches.length - 1; i >= currentMatchIndex; i--) {\r
+                                               if (this.matches[i].isVisible()) {\r
+                                                       return i;\r
+                                               }\r
+                                       }\r
+                                       return -1;\r
+                               },\r
+\r
+                               applyTo: function(logEntry) {\r
+                                       var doesMatch = this.match(logEntry);\r
+                                       if (doesMatch) {\r
+                                               logEntry.group.expand();\r
+                                               logEntry.setSearchMatch(true);\r
+                                               var logEntryContent;\r
+                                               var wrappedLogEntryContent;\r
+                                               var searchTermReplacementStartTag = "<span class=\"searchterm\">";\r
+                                               var searchTermReplacementEndTag = "<" + "/span>";\r
+                                               var preTagName = isIe ? "pre" : "span";\r
+                                               var preStartTag = "<" + preTagName + " class=\"pre\">";\r
+                                               var preEndTag = "<" + "/" + preTagName + ">";\r
+                                               var startIndex = 0;\r
+                                               var searchIndex, matchedText, textBeforeMatch;\r
+                                               if (this.isRegex) {\r
+                                                       var flags = this.isCaseSensitive ? "g" : "gi";\r
+                                                       var capturingRegex = new RegExp("(" + this.searchRegex.source + ")", flags);\r
+\r
+                                                       // Replace the search term with temporary tokens for the start and end tags\r
+                                                       var rnd = ("" + Math.random()).substr(2);\r
+                                                       var startToken = "%%s" + rnd + "%%";\r
+                                                       var endToken = "%%e" + rnd + "%%";\r
+                                                       logEntryContent = logEntry.formattedMessage.replace(capturingRegex, startToken + "$1" + endToken);\r
+\r
+                                                       // Escape the HTML to get rid of angle brackets\r
+                                                       logEntryContent = escapeHtml(logEntryContent);\r
+\r
+                                                       // Substitute the proper HTML back in for the search match\r
+                                                       var result;\r
+                                                       var searchString = logEntryContent;\r
+                                                       logEntryContent = "";\r
+                                                       wrappedLogEntryContent = "";\r
+                                                       while ((searchIndex = searchString.indexOf(startToken, startIndex)) > -1) {\r
+                                                               var endTokenIndex = searchString.indexOf(endToken, searchIndex);\r
+                                                               matchedText = searchString.substring(searchIndex + startToken.length, endTokenIndex);\r
+                                                               textBeforeMatch = searchString.substring(startIndex, searchIndex);\r
+                                                               logEntryContent += preStartTag + textBeforeMatch + preEndTag;\r
+                                                               logEntryContent += searchTermReplacementStartTag + preStartTag + matchedText +\r
+                                                                       preEndTag + searchTermReplacementEndTag;\r
+                                                               if (isIe) {\r
+                                                                       wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +\r
+                                                                               matchedText + searchTermReplacementEndTag;\r
+                                                               }\r
+                                                               startIndex = endTokenIndex + endToken.length;\r
+                                                       }\r
+                                                       logEntryContent += preStartTag + searchString.substr(startIndex) + preEndTag;\r
+                                                       if (isIe) {\r
+                                                               wrappedLogEntryContent += searchString.substr(startIndex);\r
+                                                       }\r
+                                               } else {\r
+                                                       logEntryContent = "";\r
+                                                       wrappedLogEntryContent = "";\r
+                                                       var searchTermReplacementLength = searchTermReplacementStartTag.length +\r
+                                                               this.searchTerm.length + searchTermReplacementEndTag.length;\r
+                                                       var searchTermLength = this.searchTerm.length;\r
+                                                       var searchTermLowerCase = this.searchTerm.toLowerCase();\r
+                                                       var logTextLowerCase = logEntry.formattedMessage.toLowerCase();\r
+                                                       while ((searchIndex = logTextLowerCase.indexOf(searchTermLowerCase, startIndex)) > -1) {\r
+                                                               matchedText = escapeHtml(logEntry.formattedMessage.substr(searchIndex, this.searchTerm.length));\r
+                                                               textBeforeMatch = escapeHtml(logEntry.formattedMessage.substring(startIndex, searchIndex));\r
+                                                               var searchTermReplacement = searchTermReplacementStartTag +\r
+                                                                       preStartTag + matchedText + preEndTag + searchTermReplacementEndTag;\r
+                                                               logEntryContent += preStartTag + textBeforeMatch + preEndTag + searchTermReplacement;\r
+                                                               if (isIe) {\r
+                                                                       wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +\r
+                                                                               matchedText + searchTermReplacementEndTag;\r
+                                                               }\r
+                                                               startIndex = searchIndex + searchTermLength;\r
+                                                       }\r
+                                                       var textAfterLastMatch = escapeHtml(logEntry.formattedMessage.substr(startIndex));\r
+                                                       logEntryContent += preStartTag + textAfterLastMatch + preEndTag;\r
+                                                       if (isIe) {\r
+                                                               wrappedLogEntryContent += textAfterLastMatch;\r
+                                                       }\r
+                                               }\r
+                                               logEntry.setContent(logEntryContent, wrappedLogEntryContent);\r
+                                               var logEntryMatches = logEntry.getSearchMatches();\r
+                                               this.matches = this.matches.concat(logEntryMatches);\r
+                                       } else {\r
+                                               logEntry.setSearchMatch(false);\r
+                                               logEntry.setContent(logEntry.formattedMessage, logEntry.formattedMessage);\r
+                                       }\r
+                                       return doesMatch;\r
+                               },\r
+\r
+                               removeMatches: function(logEntries) {\r
+                                       var matchesToRemoveCount = 0;\r
+                                       var currentMatchRemoved = false;\r
+                                       var matchesToRemove = [];\r
+                                       var i, iLen, j, jLen;\r
+\r
+                                       // Establish the list of matches to be removed\r
+                                       for (i = 0, iLen = this.matches.length; i < iLen; i++) {\r
+                                               for (j = 0, jLen = logEntries.length; j < jLen; j++) {\r
+                                                       if (this.matches[i].belongsTo(logEntries[j])) {\r
+                                                               matchesToRemove.push(this.matches[i]);\r
+                                                               if (i === currentMatchIndex) {\r
+                                                                       currentMatchRemoved = true;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Set the new current match index if the current match has been deleted\r
+                                       // This will be the first match that appears after the first log entry being\r
+                                       // deleted, if one exists; otherwise, it's the first match overall\r
+                                       var newMatch = currentMatchRemoved ? null : this.matches[currentMatchIndex];\r
+                                       if (currentMatchRemoved) {\r
+                                               for (i = currentMatchIndex, iLen = this.matches.length; i < iLen; i++) {\r
+                                                       if (this.matches[i].isVisible() && !array_contains(matchesToRemove, this.matches[i])) {\r
+                                                               newMatch = this.matches[i];\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Remove the matches\r
+                                       for (i = 0, iLen = matchesToRemove.length; i < iLen; i++) {\r
+                                               array_remove(this.matches, matchesToRemove[i]);\r
+                                               matchesToRemove[i].remove();\r
+                                       }\r
+\r
+                                       // Set the new match, if one exists\r
+                                       if (this.hasVisibleMatches()) {\r
+                                               if (newMatch === null) {\r
+                                                       setCurrentMatchIndex(0);\r
+                                               } else {\r
+                                                       // Get the index of the new match\r
+                                                       var newMatchIndex = 0;\r
+                                                       for (i = 0, iLen = this.matches.length; i < iLen; i++) {\r
+                                                               if (newMatch === this.matches[i]) {\r
+                                                                       newMatchIndex = i;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                                       setCurrentMatchIndex(newMatchIndex);\r
+                                               }\r
+                                       } else {\r
+                                               currentMatchIndex = null;\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       function getPageOffsetTop(el, container) {\r
+                               var currentEl = el;\r
+                               var y = 0;\r
+                               while (currentEl && currentEl != container) {\r
+                                       y += currentEl.offsetTop;\r
+                                       currentEl = currentEl.offsetParent;\r
+                               }\r
+                               return y;\r
+                       }\r
+\r
+                       function scrollIntoView(el) {\r
+                               var logContainer = logMainContainer;\r
+                               // Check if the whole width of the element is visible and centre if not\r
+                               if (!$("wrap").checked) {\r
+                                       var logContainerLeft = logContainer.scrollLeft;\r
+                                       var logContainerRight = logContainerLeft  + logContainer.offsetWidth;\r
+                                       var elLeft = el.offsetLeft;\r
+                                       var elRight = elLeft + el.offsetWidth;\r
+                                       if (elLeft < logContainerLeft || elRight > logContainerRight) {\r
+                                               logContainer.scrollLeft = elLeft - (logContainer.offsetWidth - el.offsetWidth) / 2;\r
+                                       }\r
+                               }\r
+                               // Check if the whole height of the element is visible and centre if not\r
+                               var logContainerTop = logContainer.scrollTop;\r
+                               var logContainerBottom = logContainerTop  + logContainer.offsetHeight;\r
+                               var elTop = getPageOffsetTop(el) - getToolBarsHeight();\r
+                               var elBottom = elTop + el.offsetHeight;\r
+                               if (elTop < logContainerTop || elBottom > logContainerBottom) {\r
+                                       logContainer.scrollTop = elTop - (logContainer.offsetHeight - el.offsetHeight) / 2;\r
+                               }\r
+                       }\r
+\r
+                       function Match(logEntryLevel, spanInMainDiv, spanInUnwrappedPre, spanInWrappedDiv) {\r
+                               this.logEntryLevel = logEntryLevel;\r
+                               this.spanInMainDiv = spanInMainDiv;\r
+                               if (isIe) {\r
+                                       this.spanInUnwrappedPre = spanInUnwrappedPre;\r
+                                       this.spanInWrappedDiv = spanInWrappedDiv;\r
+                               }\r
+                               this.mainSpan = isIe ? spanInUnwrappedPre : spanInMainDiv;\r
+                       }\r
+\r
+                       Match.prototype = {\r
+                               equals: function(match) {\r
+                                       return this.mainSpan === match.mainSpan;\r
+                               },\r
+\r
+                               setCurrent: function() {\r
+                                       if (isIe) {\r
+                                               addClass(this.spanInUnwrappedPre, "currentmatch");\r
+                                               addClass(this.spanInWrappedDiv, "currentmatch");\r
+                                               // Scroll the visible one into view\r
+                                               var elementToScroll = $("wrap").checked ? this.spanInWrappedDiv : this.spanInUnwrappedPre;\r
+                                               scrollIntoView(elementToScroll);\r
+                                       } else {\r
+                                               addClass(this.spanInMainDiv, "currentmatch");\r
+                                               scrollIntoView(this.spanInMainDiv);\r
+                                       }\r
+                               },\r
+\r
+                               belongsTo: function(logEntry) {\r
+                                       if (isIe) {\r
+                                               return isDescendant(this.spanInUnwrappedPre, logEntry.unwrappedPre);\r
+                                       } else {\r
+                                               return isDescendant(this.spanInMainDiv, logEntry.mainDiv);\r
+                                       }\r
+                               },\r
+\r
+                               setNotCurrent: function() {\r
+                                       if (isIe) {\r
+                                               removeClass(this.spanInUnwrappedPre, "currentmatch");\r
+                                               removeClass(this.spanInWrappedDiv, "currentmatch");\r
+                                       } else {\r
+                                               removeClass(this.spanInMainDiv, "currentmatch");\r
+                                       }\r
+                               },\r
+\r
+                               isOrphan: function() {\r
+                                       return isOrphan(this.mainSpan);\r
+                               },\r
+\r
+                               isVisible: function() {\r
+                                       return getCheckBox(this.logEntryLevel).checked;\r
+                               },\r
+\r
+                               remove: function() {\r
+                                       if (isIe) {\r
+                                               this.spanInUnwrappedPre = null;\r
+                                               this.spanInWrappedDiv = null;\r
+                                       } else {\r
+                                               this.spanInMainDiv = null;\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       var currentSearch = null;\r
+                       var currentMatchIndex = null;\r
+\r
+                       function doSearch() {\r
+                               var searchBox = $("searchBox");\r
+                               var searchTerm = searchBox.value;\r
+                               var isRegex = $("searchRegex").checked;\r
+                               var isCaseSensitive = $("searchCaseSensitive").checked;\r
+                               var i;\r
+\r
+                               if (searchTerm === "") {\r
+                                       $("searchReset").disabled = true;\r
+                                       $("searchNav").style.display = "none";\r
+                                       removeClass(document.body, "searching");\r
+                                       removeClass(searchBox, "hasmatches");\r
+                                       removeClass(searchBox, "nomatches");\r
+                                       for (i = 0; i < logEntries.length; i++) {\r
+                                               logEntries[i].clearSearch();\r
+                                               logEntries[i].setContent(logEntries[i].formattedMessage, logEntries[i].formattedMessage);\r
+                                       }\r
+                                       currentSearch = null;\r
+                                       setLogContainerHeight();\r
+                               } else {\r
+                                       $("searchReset").disabled = false;\r
+                                       $("searchNav").style.display = "block";\r
+                                       var searchRegex;\r
+                                       var regexValid;\r
+                                       if (isRegex) {\r
+                                               try {\r
+                                                       searchRegex = isCaseSensitive ? new RegExp(searchTerm, "g") : new RegExp(searchTerm, "gi");\r
+                                                       regexValid = true;\r
+                                                       replaceClass(searchBox, "validregex", "invalidregex");\r
+                                                       searchBox.title = "Valid regex";\r
+                                               } catch (ex) {\r
+                                                       regexValid = false;\r
+                                                       replaceClass(searchBox, "invalidregex", "validregex");\r
+                                                       searchBox.title = "Invalid regex: " + (ex.message ? ex.message : (ex.description ? ex.description : "unknown error"));\r
+                                                       return;\r
+                                               }\r
+                                       } else {\r
+                                               searchBox.title = "";\r
+                                               removeClass(searchBox, "validregex");\r
+                                               removeClass(searchBox, "invalidregex");\r
+                                       }\r
+                                       addClass(document.body, "searching");\r
+                                       currentSearch = new Search(searchTerm, isRegex, searchRegex, isCaseSensitive);\r
+                                       for (i = 0; i < logEntries.length; i++) {\r
+                                               currentSearch.applyTo(logEntries[i]);\r
+                                       }\r
+                                       setLogContainerHeight();\r
+\r
+                                       // Highlight the first search match\r
+                                       if (currentSearch.hasVisibleMatches()) {\r
+                                               setCurrentMatchIndex(0);\r
+                                               displayMatches();\r
+                                       } else {\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function updateSearchFromFilters() {\r
+                               if (currentSearch) {\r
+                                       if (currentSearch.hasMatches()) {\r
+                                               if (currentMatchIndex === null) {\r
+                                                       currentMatchIndex = 0;\r
+                                               }\r
+                                               var currentMatch = currentSearch.matches[currentMatchIndex];\r
+                                               if (currentMatch.isVisible()) {\r
+                                                       displayMatches();\r
+                                                       setCurrentMatchIndex(currentMatchIndex);\r
+                                               } else {\r
+                                                       currentMatch.setNotCurrent();\r
+                                                       // Find the next visible match, if one exists\r
+                                                       var nextVisibleMatchIndex = currentSearch.getNextVisibleMatchIndex();\r
+                                                       if (nextVisibleMatchIndex > -1) {\r
+                                                               setCurrentMatchIndex(nextVisibleMatchIndex);\r
+                                                               displayMatches();\r
+                                                       } else {\r
+                                                               displayNoMatches();\r
+                                                       }\r
+                                               }\r
+                                       } else {\r
+                                               displayNoMatches();\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function refreshCurrentMatch() {\r
+                               if (currentSearch && currentSearch.hasVisibleMatches()) {\r
+                                       setCurrentMatchIndex(currentMatchIndex);\r
+                               }\r
+                       }\r
+\r
+                       function displayMatches() {\r
+                               replaceClass($("searchBox"), "hasmatches", "nomatches");\r
+                               $("searchBox").title = "" + currentSearch.matches.length + " matches found";\r
+                               $("searchNav").style.display = "block";\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function displayNoMatches() {\r
+                               replaceClass($("searchBox"), "nomatches", "hasmatches");\r
+                               $("searchBox").title = "No matches found";\r
+                               $("searchNav").style.display = "none";\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function toggleSearchEnabled(enable) {\r
+                               enable = (typeof enable == "undefined") ? !$("searchDisable").checked : enable;\r
+                               $("searchBox").disabled = !enable;\r
+                               $("searchReset").disabled = !enable;\r
+                               $("searchRegex").disabled = !enable;\r
+                               $("searchNext").disabled = !enable;\r
+                               $("searchPrevious").disabled = !enable;\r
+                               $("searchCaseSensitive").disabled = !enable;\r
+                               $("searchNav").style.display = (enable && ($("searchBox").value !== "") &&\r
+                                               currentSearch && currentSearch.hasVisibleMatches()) ?\r
+                                       "block" : "none";\r
+                               if (enable) {\r
+                                       removeClass($("search"), "greyedout");\r
+                                       addClass(document.body, "searching");\r
+                                       if ($("searchHighlight").checked) {\r
+                                               addClass(logMainContainer, "searchhighlight");\r
+                                       } else {\r
+                                               removeClass(logMainContainer, "searchhighlight");\r
+                                       }\r
+                                       if ($("searchFilter").checked) {\r
+                                               addClass(logMainContainer, "searchfilter");\r
+                                       } else {\r
+                                               removeClass(logMainContainer, "searchfilter");\r
+                                       }\r
+                                       $("searchDisable").checked = !enable;\r
+                               } else {\r
+                                       addClass($("search"), "greyedout");\r
+                                       removeClass(document.body, "searching");\r
+                                       removeClass(logMainContainer, "searchhighlight");\r
+                                       removeClass(logMainContainer, "searchfilter");\r
+                               }\r
+                               setLogContainerHeight();\r
+                       }\r
+\r
+                       function toggleSearchFilter() {\r
+                               var enable = $("searchFilter").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "searchfilter");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "searchfilter");\r
+                               }\r
+                               refreshCurrentMatch();\r
+                       }\r
+\r
+                       function toggleSearchHighlight() {\r
+                               var enable = $("searchHighlight").checked;\r
+                               if (enable) {\r
+                                       addClass(logMainContainer, "searchhighlight");\r
+                               } else {\r
+                                       removeClass(logMainContainer, "searchhighlight");\r
+                               }\r
+                       }\r
+\r
+                       function clearSearch() {\r
+                               $("searchBox").value = "";\r
+                               doSearch();\r
+                       }\r
+\r
+                       function searchNext() {\r
+                               if (currentSearch !== null && currentMatchIndex !== null) {\r
+                                       currentSearch.matches[currentMatchIndex].setNotCurrent();\r
+                                       var nextMatchIndex = currentSearch.getNextVisibleMatchIndex();\r
+                                       if (nextMatchIndex > currentMatchIndex || confirm("Reached the end of the page. Start from the top?")) {\r
+                                               setCurrentMatchIndex(nextMatchIndex);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function searchPrevious() {\r
+                               if (currentSearch !== null && currentMatchIndex !== null) {\r
+                                       currentSearch.matches[currentMatchIndex].setNotCurrent();\r
+                                       var previousMatchIndex = currentSearch.getPreviousVisibleMatchIndex();\r
+                                       if (previousMatchIndex < currentMatchIndex || confirm("Reached the start of the page. Continue from the bottom?")) {\r
+                                               setCurrentMatchIndex(previousMatchIndex);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function setCurrentMatchIndex(index) {\r
+                               currentMatchIndex = index;\r
+                               currentSearch.matches[currentMatchIndex].setCurrent();\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------------- */\r
+\r
+                       // CSS Utilities\r
+\r
+                       function addClass(el, cssClass) {\r
+                               if (!hasClass(el, cssClass)) {\r
+                                       if (el.className) {\r
+                                               el.className += " " + cssClass;\r
+                                       } else {\r
+                                               el.className = cssClass;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function hasClass(el, cssClass) {\r
+                               if (el.className) {\r
+                                       var classNames = el.className.split(" ");\r
+                                       return array_contains(classNames, cssClass);\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function removeClass(el, cssClass) {\r
+                               if (hasClass(el, cssClass)) {\r
+                                       // Rebuild the className property\r
+                                       var existingClasses = el.className.split(" ");\r
+                                       var newClasses = [];\r
+                                       for (var i = 0, len = existingClasses.length; i < len; i++) {\r
+                                               if (existingClasses[i] != cssClass) {\r
+                                                       newClasses[newClasses.length] = existingClasses[i];\r
+                                               }\r
+                                       }\r
+                                       el.className = newClasses.join(" ");\r
+                               }\r
+                       }\r
+\r
+                       function replaceClass(el, newCssClass, oldCssClass) {\r
+                               removeClass(el, oldCssClass);\r
+                               addClass(el, newCssClass);\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------------- */\r
+\r
+                       // Other utility functions\r
+\r
+                       function getElementsByClass(el, cssClass, tagName) {\r
+                               var elements = el.getElementsByTagName(tagName);\r
+                               var matches = [];\r
+                               for (var i = 0, len = elements.length; i < len; i++) {\r
+                                       if (hasClass(elements[i], cssClass)) {\r
+                                               matches.push(elements[i]);\r
+                                       }\r
+                               }\r
+                               return matches;\r
+                       }\r
+\r
+                       // Syntax borrowed from Prototype library\r
+                       function $(id) {\r
+                               return document.getElementById(id);\r
+                       }\r
+\r
+                       function isDescendant(node, ancestorNode) {\r
+                               while (node != null) {\r
+                                       if (node === ancestorNode) {\r
+                                               return true;\r
+                                       }\r
+                                       node = node.parentNode;\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function isOrphan(node) {\r
+                               var currentNode = node;\r
+                               while (currentNode) {\r
+                                       if (currentNode == document.body) {\r
+                                               return false;\r
+                                       }\r
+                                       currentNode = currentNode.parentNode;\r
+                               }\r
+                               return true;\r
+                       }\r
+\r
+                       function escapeHtml(str) {\r
+                               return str.replace(/&/g, "&amp;").replace(/[<]/g, "&lt;").replace(/>/g, "&gt;");\r
+                       }\r
+\r
+                       function getWindowWidth() {\r
+                               if (window.innerWidth) {\r
+                                       return window.innerWidth;\r
+                               } else if (document.documentElement && document.documentElement.clientWidth) {\r
+                                       return document.documentElement.clientWidth;\r
+                               } else if (document.body) {\r
+                                       return document.body.clientWidth;\r
+                               }\r
+                               return 0;\r
+                       }\r
+\r
+                       function getWindowHeight() {\r
+                               if (window.innerHeight) {\r
+                                       return window.innerHeight;\r
+                               } else if (document.documentElement && document.documentElement.clientHeight) {\r
+                                       return document.documentElement.clientHeight;\r
+                               } else if (document.body) {\r
+                                       return document.body.clientHeight;\r
+                               }\r
+                               return 0;\r
+                       }\r
+\r
+                       function getToolBarsHeight() {\r
+                               return $("switches").offsetHeight;\r
+                       }\r
+\r
+                       function getChromeHeight() {\r
+                               var height = getToolBarsHeight();\r
+                               if (showCommandLine) {\r
+                                       height += $("commandLine").offsetHeight;\r
+                               }\r
+                               return height;\r
+                       }\r
+\r
+                       function setLogContainerHeight() {\r
+                               if (logMainContainer) {\r
+                                       var windowHeight = getWindowHeight();\r
+                                       $("body").style.height = getWindowHeight() + "px";\r
+                                       logMainContainer.style.height = "" +\r
+                                               Math.max(0, windowHeight - getChromeHeight()) + "px";\r
+                               }\r
+                       }\r
+\r
+                       function setCommandInputWidth() {\r
+                               if (showCommandLine) {\r
+                                       $("command").style.width = "" + Math.max(0, $("commandLineContainer").offsetWidth -\r
+                                               ($("evaluateButton").offsetWidth + 13)) + "px";\r
+                               }\r
+                       }\r
+\r
+                       window.onresize = function() {\r
+                               setCommandInputWidth();\r
+                               setLogContainerHeight();\r
+                       };\r
+\r
+                       if (!Array.prototype.push) {\r
+                               Array.prototype.push = function() {\r
+                               for (var i = 0, len = arguments.length; i < len; i++){\r
+                                   this[this.length] = arguments[i];\r
+                               }\r
+                               return this.length;\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.pop) {\r
+                               Array.prototype.pop = function() {\r
+                                       if (this.length > 0) {\r
+                                               var val = this[this.length - 1];\r
+                                               this.length = this.length - 1;\r
+                                               return val;\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.shift) {\r
+                               Array.prototype.shift = function() {\r
+                                       if (this.length > 0) {\r
+                                               var firstItem = this[0];\r
+                                               for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                                                       this[i] = this[i + 1];\r
+                                               }\r
+                                               this.length = this.length - 1;\r
+                                               return firstItem;\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       if (!Array.prototype.splice) {\r
+                               Array.prototype.splice = function(startIndex, deleteCount) {\r
+                                       var itemsAfterDeleted = this.slice(startIndex + deleteCount);\r
+                                       var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);\r
+                                       this.length = startIndex;\r
+                                       // Copy the arguments into a proper Array object\r
+                                       var argumentsArray = [];\r
+                                       for (var i = 0, len = arguments.length; i < len; i++) {\r
+                                               argumentsArray[i] = arguments[i];\r
+                                       }\r
+                                       var itemsToAppend = (argumentsArray.length > 2) ?\r
+                                               itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;\r
+                                       for (i = 0, len = itemsToAppend.length; i < len; i++) {\r
+                                               this.push(itemsToAppend[i]);\r
+                                       }\r
+                                       return itemsDeleted;\r
+                               };\r
+                       }\r
+\r
+                       function array_remove(arr, val) {\r
+                               var index = -1;\r
+                               for (var i = 0, len = arr.length; i < len; i++) {\r
+                                       if (arr[i] === val) {\r
+                                               index = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               if (index >= 0) {\r
+                                       arr.splice(index, 1);\r
+                                       return index;\r
+                               } else {\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       function array_removeFromStart(array, numberToRemove) {\r
+                               if (Array.prototype.splice) {\r
+                                       array.splice(0, numberToRemove);\r
+                               } else {\r
+                                       for (var i = numberToRemove, len = array.length; i < len; i++) {\r
+                                               array[i - numberToRemove] = array[i];\r
+                                       }\r
+                                       array.length = array.length - numberToRemove;\r
+                               }\r
+                               return array;\r
+                       }\r
+\r
+                       function array_contains(arr, val) {\r
+                               for (var i = 0, len = arr.length; i < len; i++) {\r
+                                       if (arr[i] == val) {\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                               return false;\r
+                       }\r
+\r
+                       function getErrorMessage(ex) {\r
+                               if (ex.message) {\r
+                                       return ex.message;\r
+                               } else if (ex.description) {\r
+                                       return ex.description;\r
+                               }\r
+                               return "" + ex;\r
+                       }\r
+\r
+                       function moveCaretToEnd(input) {\r
+                               if (input.setSelectionRange) {\r
+                                       input.focus();\r
+                                       var length = input.value.length;\r
+                                       input.setSelectionRange(length, length);\r
+                               } else if (input.createTextRange) {\r
+                                       var range = input.createTextRange();\r
+                                       range.collapse(false);\r
+                                       range.select();\r
+                               }\r
+                               input.focus();\r
+                       }\r
+\r
+                       function stopPropagation(evt) {\r
+                               if (evt.stopPropagation) {\r
+                                       evt.stopPropagation();\r
+                               } else if (typeof evt.cancelBubble != "undefined") {\r
+                                       evt.cancelBubble = true;\r
+                               }\r
+                       }\r
+\r
+                       function getEvent(evt) {\r
+                               return evt ? evt : event;\r
+                       }\r
+\r
+                       function getTarget(evt) {\r
+                               return evt.target ? evt.target : evt.srcElement;\r
+                       }\r
+\r
+                       function getRelatedTarget(evt) {\r
+                               if (evt.relatedTarget) {\r
+                                       return evt.relatedTarget;\r
+                               } else if (evt.srcElement) {\r
+                                       switch(evt.type) {\r
+                                               case "mouseover":\r
+                                                       return evt.fromElement;\r
+                                               case "mouseout":\r
+                                                       return evt.toElement;\r
+                                               default:\r
+                                                       return evt.srcElement;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function cancelKeyEvent(evt) {\r
+                               evt.returnValue = false;\r
+                               stopPropagation(evt);\r
+                       }\r
+\r
+                       function evalCommandLine() {\r
+                               var expr = $("command").value;\r
+                               evalCommand(expr);\r
+                               $("command").value = "";\r
+                       }\r
+\r
+                       function evalLastCommand() {\r
+                               if (lastCommand != null) {\r
+                                       evalCommand(lastCommand);\r
+                               }\r
+                       }\r
+\r
+                       var lastCommand = null;\r
+                       var commandHistory = [];\r
+                       var currentCommandIndex = 0;\r
+\r
+                       function evalCommand(expr) {\r
+                               if (appender) {\r
+                                       appender.evalCommandAndAppend(expr);\r
+                               } else {\r
+                                       var prefix = ">>> " + expr + "\r\n";\r
+                                       try {\r
+                                               log("INFO", prefix + eval(expr));\r
+                                       } catch (ex) {\r
+                                               log("ERROR", prefix + "Error: " + getErrorMessage(ex));\r
+                                       }\r
+                               }\r
+                               // Update command history\r
+                               if (expr != commandHistory[commandHistory.length - 1]) {\r
+                                       commandHistory.push(expr);\r
+                                       // Update the appender\r
+                                       if (appender) {\r
+                                               appender.storeCommandHistory(commandHistory);\r
+                                       }\r
+                               }\r
+                               currentCommandIndex = (expr == commandHistory[currentCommandIndex]) ? currentCommandIndex + 1 : commandHistory.length;\r
+                               lastCommand = expr;\r
+                       }\r
+                       //]]>\r
+               </script>\r
+               <style type="text/css">\r
+                       body {\r
+                               background-color: white;\r
+                               color: black;\r
+                               padding: 0;\r
+                               margin: 0;\r
+                               font-family: tahoma, verdana, arial, helvetica, sans-serif;\r
+                               overflow: hidden;\r
+                       }\r
+\r
+                       div#switchesContainer input {\r
+                               margin-bottom: 0;\r
+                       }\r
+\r
+                       div.toolbar {\r
+                               border-top: solid #ffffff 1px;\r
+                               border-bottom: solid #aca899 1px;\r
+                               background-color: #f1efe7;\r
+                               padding: 3px 5px;\r
+                               font-size: 68.75%;\r
+                       }\r
+\r
+                       div.toolbar, div#search input {\r
+                               font-family: tahoma, verdana, arial, helvetica, sans-serif;\r
+                       }\r
+\r
+                       div.toolbar input.button {\r
+                               padding: 0 5px;\r
+                               font-size: 100%;\r
+                       }\r
+\r
+                       div.toolbar input.hidden {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#switches input#clearButton {\r
+                               margin-left: 20px;\r
+                       }\r
+\r
+                       div#levels label {\r
+                               font-weight: bold;\r
+                       }\r
+\r
+                       div#levels label, div#options label {\r
+                               margin-right: 5px;\r
+                       }\r
+\r
+                       div#levels label#wrapLabel {\r
+                               font-weight: normal;\r
+                       }\r
+\r
+                       div#search label {\r
+                               margin-right: 10px;\r
+                       }\r
+\r
+                       div#search label.searchboxlabel {\r
+                               margin-right: 0;\r
+                       }\r
+\r
+                       div#search input {\r
+                               font-size: 100%;\r
+                       }\r
+\r
+                       div#search input.validregex {\r
+                               color: green;\r
+                       }\r
+\r
+                       div#search input.invalidregex {\r
+                               color: red;\r
+                       }\r
+\r
+                       div#search input.nomatches {\r
+                               color: white;\r
+                               background-color: #ff6666;\r
+                       }\r
+\r
+                       div#search input.nomatches {\r
+                               color: white;\r
+                               background-color: #ff6666;\r
+                       }\r
+\r
+                       div#searchNav {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#commandLine {\r
+                               display: none;\r
+                       }\r
+\r
+                       div#commandLine input#command {\r
+                               font-size: 100%;\r
+                               font-family: Courier New, Courier;\r
+                       }\r
+\r
+                       div#commandLine input#evaluateButton {\r
+                       }\r
+\r
+                       *.greyedout {\r
+                               color: gray !important;\r
+                               border-color: gray !important;\r
+                       }\r
+\r
+                       *.greyedout *.alwaysenabled { color: black; }\r
+\r
+                       *.unselectable {\r
+                               -khtml-user-select: none;\r
+                               -moz-user-select: none;\r
+                               user-select: none;\r
+                       }\r
+\r
+                       div#log {\r
+                               font-family: Courier New, Courier;\r
+                               font-size: 75%;\r
+                               width: 100%;\r
+                               overflow: auto;\r
+                               clear: both;\r
+                               position: relative;\r
+                       }\r
+\r
+                       div.group {\r
+                               border-color: #cccccc;\r
+                               border-style: solid;\r
+                               border-width: 1px 0 1px 1px;\r
+                               overflow: visible;\r
+                       }\r
+\r
+                       div.oldIe div.group, div.oldIe div.group *, div.oldIe *.logentry {\r
+                               height: 1%;\r
+                       }\r
+\r
+                       div.group div.groupheading span.expander {\r
+                               border: solid black 1px;\r
+                               font-family: Courier New, Courier;\r
+                               font-size: 0.833em;\r
+                               background-color: #eeeeee;\r
+                               position: relative;\r
+                               top: -1px;\r
+                               color: black;\r
+                               padding: 0 2px;\r
+                               cursor: pointer;\r
+                               cursor: hand;\r
+                               height: 1%;\r
+                       }\r
+\r
+                       div.group div.groupcontent {\r
+                               margin-left: 10px;\r
+                               padding-bottom: 2px;\r
+                               overflow: visible;\r
+                       }\r
+\r
+                       div.group div.expanded {\r
+                               display: block;\r
+                       }\r
+\r
+                       div.group div.collapsed {\r
+                               display: none;\r
+                       }\r
+\r
+                       *.logentry {\r
+                               overflow: visible;\r
+                               display: none;\r
+                               white-space: pre;\r
+                       }\r
+\r
+                       span.pre {\r
+                               white-space: pre;\r
+                       }\r
+                       \r
+                       pre.unwrapped {\r
+                               display: inline !important;\r
+                       }\r
+\r
+                       pre.unwrapped pre.pre, div.wrapped pre.pre {\r
+                               display: inline;\r
+                       }\r
+\r
+                       div.wrapped pre.pre {\r
+                               white-space: normal;\r
+                       }\r
+\r
+                       div.wrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       body.searching *.logentry span.currentmatch {\r
+                               color: white !important;\r
+                               background-color: green !important;\r
+                       }\r
+\r
+                       body.searching div.searchhighlight *.logentry span.searchterm {\r
+                               color: black;\r
+                               background-color: yellow;\r
+                       }\r
+\r
+                       div.wrap *.logentry {\r
+                               white-space: normal !important;\r
+                               border-width: 0 0 1px 0;\r
+                               border-color: #dddddd;\r
+                               border-style: dotted;\r
+                       }\r
+\r
+                       div.wrap #log_wrapped, #log_unwrapped {\r
+                               display: block;\r
+                       }\r
+\r
+                       div.wrap #log_unwrapped, #log_wrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       div.wrap *.logentry span.pre {\r
+                               overflow: visible;\r
+                               white-space: normal;\r
+                       }\r
+\r
+                       div.wrap *.logentry pre.unwrapped {\r
+                               display: none;\r
+                       }\r
+\r
+                       div.wrap *.logentry span.wrapped {\r
+                               display: inline;\r
+                       }\r
+\r
+                       div.searchfilter *.searchnonmatch {\r
+                               display: none !important;\r
+                       }\r
+\r
+                       div#log *.TRACE, label#label_TRACE {\r
+                               color: #666666;\r
+                       }\r
+\r
+                       div#log *.DEBUG, label#label_DEBUG {\r
+                               color: green;\r
+                       }\r
+\r
+                       div#log *.INFO, label#label_INFO {\r
+                               color: #000099;\r
+                       }\r
+\r
+                       div#log *.WARN, label#label_WARN {\r
+                               color: #999900;\r
+                       }\r
+\r
+                       div#log *.ERROR, label#label_ERROR {\r
+                               color: red;\r
+                       }\r
+\r
+                       div#log *.FATAL, label#label_FATAL {\r
+                               color: #660066;\r
+                       }\r
+\r
+                       div.TRACE#log *.TRACE,\r
+                       div.DEBUG#log *.DEBUG,\r
+                       div.INFO#log *.INFO,\r
+                       div.WARN#log *.WARN,\r
+                       div.ERROR#log *.ERROR,\r
+                       div.FATAL#log *.FATAL {\r
+                               display: block;\r
+                       }\r
+\r
+                       div#log div.separator {\r
+                               background-color: #cccccc;\r
+                               margin: 5px 0;\r
+                               line-height: 1px;\r
+                       }\r
+               </style>\r
+       </head>\r
+\r
+       <body id="body">\r
+               <div id="switchesContainer">\r
+                       <div id="switches">\r
+                               <div id="levels" class="toolbar">\r
+                                       Filters:\r
+                                       <input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>\r
+                                       <input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>\r
+                                       <input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>\r
+                                       <input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>\r
+                                       <input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>\r
+                                       <input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>\r
+                                       <input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>\r
+                               </div>\r
+                               <div id="search" class="toolbar">\r
+                                       <label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />\r
+                                       <input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />\r
+                                       <input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>\r
+                                       <input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>\r
+                                       <input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>\r
+                                       <div id="searchNav">\r
+                                               <input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />\r
+                                               <input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />\r
+                                               <input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>\r
+                                               <input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>\r
+                                       </div>\r
+                               </div>\r
+                               <div id="options" class="toolbar">\r
+                                       Options:\r
+                                       <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>\r
+                                       <input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>\r
+                                       <input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>\r
+                                       <input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>\r
+                                       <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />\r
+                                       <input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />\r
+                                       <input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />\r
+                               </div>\r
+                       </div>\r
+               </div>\r
+               <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+               <div id="commandLine" class="toolbar">\r
+                       <div id="commandLineContainer">\r
+                               <input type="text" id="command" title="Enter a JavaScript command here and hit return or press 'Evaluate'" />\r
+                               <input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />\r
+                       </div>\r
+               </div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/liteconsole.html b/planetstack/core/static/log4javascript-1.4.6/js/liteconsole.html
new file mode 100644 (file)
index 0000000..840a59b
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+<head>\r
+<title>log4javascript</title>\r
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+<meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+<script type="text/javascript">\r
+//<![CDATA[\r
+var loggingEnabled=true;var messagesBeforeDocLoaded=[];function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}\r
+function setLoggingEnabled(enable){loggingEnabled=enable;}\r
+function scrollToLatestEntry(){var l=getLogContainer();if(typeof l.scrollTop!="undefined"){var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}\r
+function log(logLevel,formattedMessage){if(loggingEnabled){if(loaded){doLog(logLevel,formattedMessage);}else{messagesBeforeDocLoaded.push([logLevel,formattedMessage]);}}}\r
+function doLog(logLevel,formattedMessage){var logEntry=document.createElement("div");logEntry.appendChild(document.createTextNode(formattedMessage));logEntry.className="logentry "+logLevel.name;getLogContainer().appendChild(logEntry);scrollToLatestEntry();}\r
+function mainPageReloaded(){var separator=document.createElement("div");separator.className="separator";separator.innerHTML="&nbsp;";getLogContainer().appendChild(separator);}\r
+var loaded=false;var logLevels=["DEBUG","INFO","WARN","ERROR","FATAL"];window.onload=function(){setLogContainerHeight();toggleLoggingEnabled();for(var i=0;i<messagesBeforeDocLoaded.length;i++){doLog(messagesBeforeDocLoaded[i][0],messagesBeforeDocLoaded[i][1]);}\r
+messagesBeforeDocLoaded=[];loaded=true;setTimeout(setLogContainerHeight,20);};function getLogContainer(){return $("log");}\r
+function clearLog(){getLogContainer().innerHTML="";}\r
+function $(id){return document.getElementById(id);}\r
+function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}\r
+return 0;}\r
+function getChromeHeight(){return $("toolbar").offsetHeight;}\r
+function setLogContainerHeight(){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";getLogContainer().style.height=""+\r
+Math.max(0,windowHeight-getChromeHeight())+"px";}\r
+window.onresize=function(){setLogContainerHeight();};\r
+//]]>\r
+</script>\r
+<style type="text/css">\r
+body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div#toolbar input.button{padding:0 5px;font-size:100%}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both}*.logentry{overflow:visible;white-space:pre}*.TRACE{color:#666666}*.DEBUG{color:green}*.INFO{color:#000099}*.WARN{color:#999900}*.ERROR{color:red}*.FATAL{color:#660066}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}\r
+</style>\r
+</head>\r
+<body id="body">\r
+<div id="toolbar">\r
+Options:\r
+<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" class="stateful" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Enable logging</label>\r
+<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="stateful button" title="Clear all log messages"  />\r
+<input type="button" id="closeButton" value="Close" onclick="window.close()" class="stateful button" title="Close the window" />\r
+</div>\r
+<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+</body>\r
+</html>
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/liteconsole_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/js/liteconsole_uncompressed.html
new file mode 100644 (file)
index 0000000..df5275f
--- /dev/null
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript</title>\r
+               <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+               <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->\r
+               <meta http-equiv="X-UA-Compatible" content="IE=7" />\r
+               <script type="text/javascript">\r
+                       //<![CDATA[\r
+                       var loggingEnabled = true;\r
+                       var messagesBeforeDocLoaded = [];\r
+\r
+                       function toggleLoggingEnabled() {\r
+                               setLoggingEnabled($("enableLogging").checked);\r
+                       }\r
+\r
+                       function setLoggingEnabled(enable) {\r
+                               loggingEnabled = enable;\r
+                       }\r
+\r
+                       function scrollToLatestEntry() {\r
+                               var l = getLogContainer();\r
+                               if (typeof l.scrollTop != "undefined") {\r
+                                       var latestLogEntry = l.lastChild;\r
+                                       if (latestLogEntry) {\r
+                                               l.scrollTop = l.scrollHeight;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function log(logLevel, formattedMessage) {\r
+                               if (loggingEnabled) {\r
+                                       if (loaded) {\r
+                                               doLog(logLevel, formattedMessage);\r
+                                       } else {\r
+                                               messagesBeforeDocLoaded.push([logLevel, formattedMessage]);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       function doLog(logLevel, formattedMessage) {\r
+                               var logEntry = document.createElement("div");\r
+                               logEntry.appendChild(document.createTextNode(formattedMessage));\r
+                               logEntry.className = "logentry " + logLevel.name;\r
+                               getLogContainer().appendChild(logEntry);\r
+                               scrollToLatestEntry();\r
+                       }\r
+\r
+                       function mainPageReloaded() {\r
+                               var separator = document.createElement("div");\r
+                               separator.className = "separator";\r
+                               separator.innerHTML = "&nbsp;";\r
+                               getLogContainer().appendChild(separator);\r
+                       }\r
+\r
+                       var loaded = false;\r
+                       var logLevels = ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"];\r
+\r
+                       window.onload = function() {\r
+                               setLogContainerHeight();\r
+                               toggleLoggingEnabled();\r
+                               for (var i = 0; i < messagesBeforeDocLoaded.length; i++) {\r
+                                       doLog(messagesBeforeDocLoaded[i][0], messagesBeforeDocLoaded[i][1]);\r
+                               }\r
+                               messagesBeforeDocLoaded = [];\r
+                               loaded = true;\r
+\r
+                               // Workaround to make sure log div starts at the correct size\r
+                               setTimeout(setLogContainerHeight, 20);\r
+                       };\r
+\r
+                       function getLogContainer() {\r
+                               return $("log");\r
+                       }\r
+\r
+                       function clearLog() {\r
+                               getLogContainer().innerHTML = "";\r
+                       }\r
+\r
+                       /* ------------------------------------------------------------------------- */\r
+\r
+                       // Other utility functions\r
+\r
+                       // Syntax borrowed from Prototype library\r
+                       function $(id) {\r
+                               return document.getElementById(id);\r
+                       }\r
+\r
+                       function getWindowHeight() {\r
+                               if (window.innerHeight) {\r
+                                       return window.innerHeight;\r
+                               } else if (document.documentElement && document.documentElement.clientHeight) {\r
+                                       return document.documentElement.clientHeight;\r
+                               } else if (document.body) {\r
+                                       return document.body.clientHeight;\r
+                               }\r
+                               return 0;\r
+                       }\r
+\r
+                       function getChromeHeight() {\r
+                               return $("toolbar").offsetHeight;\r
+                       }\r
+\r
+                       function setLogContainerHeight() {\r
+                               var windowHeight = getWindowHeight();\r
+                               $("body").style.height = getWindowHeight() + "px";\r
+                               getLogContainer().style.height = "" +\r
+                                       Math.max(0, windowHeight - getChromeHeight()) + "px";\r
+                       }\r
+\r
+                       window.onresize = function() {\r
+                               setLogContainerHeight();\r
+                       };\r
+\r
+                       //]]>\r
+               </script>\r
+               <style type="text/css">\r
+                       body {\r
+                               background-color: white;\r
+                               color: black;\r
+                               padding: 0;\r
+                               margin: 0;\r
+                               font-family: tahoma, verdana, arial, helvetica, sans-serif;\r
+                               overflow: hidden;\r
+                       }\r
+                       \r
+                       div#toolbar {\r
+                               border-top: solid #ffffff 1px;\r
+                               border-bottom: solid #aca899 1px;\r
+                               background-color: #f1efe7;\r
+                               padding: 3px 5px;\r
+                               font-size: 68.75%;\r
+                       }\r
+\r
+                       div#toolbar input.button {\r
+                               padding: 0 5px;\r
+                               font-size: 100%;\r
+                       }\r
+\r
+                       div#log {\r
+                               font-family: Courier New, Courier;\r
+                               font-size: 75%;\r
+                               width: 100%;\r
+                               overflow: auto;\r
+                               clear: both;\r
+                       }\r
+\r
+                       *.logentry {\r
+                               overflow: visible;\r
+                               white-space: pre;\r
+                       }\r
+\r
+                       *.TRACE {\r
+                               color: #666666;\r
+                       }\r
+\r
+                       *.DEBUG {\r
+                               color: green;\r
+                       }\r
+\r
+                       *.INFO {\r
+                               color: #000099;\r
+                       }\r
+\r
+                       *.WARN {\r
+                               color: #999900;\r
+                       }\r
+\r
+                       *.ERROR {\r
+                               color: red;\r
+                       }\r
+\r
+                       *.FATAL {\r
+                               color: #660066;\r
+                       }\r
+\r
+                       div#log div.separator {\r
+                               background-color: #cccccc;\r
+                               margin: 5px 0;\r
+                               line-height: 1px;\r
+                       }\r
+               </style>\r
+       </head>\r
+\r
+       <body id="body">\r
+               <div id="toolbar">\r
+                       Options:\r
+                       <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" class="stateful" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Enable logging</label>\r
+                       <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="stateful button" title="Clear all log messages"  />\r
+                       <input type="button" id="closeButton" value="Close" onclick="window.close()" class="stateful button" title="Close the window" />\r
+               </div>\r
+               <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>\r
+       </body>\r
+</html>
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript.js
new file mode 100644 (file)
index 0000000..042daa9
--- /dev/null
@@ -0,0 +1,274 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}\r
+return this.length;};}\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length=this.length-1;return firstItem;}};}\r
+if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}\r
+var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}\r
+return itemsDeleted;};}\r
+var log4javascript=(function(){function isUndefined(obj){return typeof obj=="undefined";}\r
+function EventSupport(){}\r
+EventSupport.prototype={eventTypes:[],eventListeners:{},setEventTypes:function(eventTypesParam){if(eventTypesParam instanceof Array){this.eventTypes=eventTypesParam;this.eventListeners={};for(var i=0,len=this.eventTypes.length;i<len;i++){this.eventListeners[this.eventTypes[i]]=[];}}else{handleError("log4javascript.EventSupport ["+this+"]: setEventTypes: eventTypes parameter must be an Array");}},addEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: addEventListener: no event called '"+eventType+"'");}\r
+this.eventListeners[eventType].push(listener);}else{handleError("log4javascript.EventSupport ["+this+"]: addEventListener: listener must be a function");}},removeEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: no event called '"+eventType+"'");}\r
+array_remove(this.eventListeners[eventType],listener);}else{handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: listener must be a function");}},dispatchEvent:function(eventType,eventArgs){if(array_contains(this.eventTypes,eventType)){var listeners=this.eventListeners[eventType];for(var i=0,len=listeners.length;i<len;i++){listeners[i](this,eventType,eventArgs);}}else{handleError("log4javascript.EventSupport ["+this+"]: dispatchEvent: no event called '"+eventType+"'");}}};var applicationStartDate=new Date();var uniqueId="log4javascript_"+applicationStartDate.getTime()+"_"+\r
+Math.floor(Math.random()*100000000);var emptyFunction=function(){};var newLine="\r\n";var pageLoaded=false;function Log4JavaScript(){}\r
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript.version="1.4.6";log4javascript.edition="log4javascript";function toStr(obj){if(obj&&obj.toString){return obj.toString();}else{return String(obj);}}\r
+function getExceptionMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}else{return toStr(ex);}}\r
+function getUrlFileName(url){var lastSlashIndex=Math.max(url.lastIndexOf("/"),url.lastIndexOf("\\"));return url.substr(lastSlashIndex+1);}\r
+function getExceptionStringRep(ex){if(ex){var exStr="Exception: "+getExceptionMessage(ex);try{if(ex.lineNumber){exStr+=" on line number "+ex.lineNumber;}\r
+if(ex.fileName){exStr+=" in file "+getUrlFileName(ex.fileName);}}catch(localEx){logLog.warn("Unable to obtain file and line information for error");}\r
+if(showStackTraces&&ex.stack){exStr+=newLine+"Stack trace:"+newLine+ex.stack;}\r
+return exStr;}\r
+return null;}\r
+function bool(obj){return Boolean(obj);}\r
+function trim(str){return str.replace(/^\s+/,"").replace(/\s+$/,"");}\r
+function splitIntoLines(text){var text2=text.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return text2.split("\n");}\r
+var urlEncode=(typeof window.encodeURIComponent!="undefined")?function(str){return encodeURIComponent(str);}:function(str){return escape(str).replace(/\+/g,"%2B").replace(/"/g,"%22").replace(/'/g,"%27").replace(/\//g,"%2F").replace(/=/g,"%3D");};var urlDecode=(typeof window.decodeURIComponent!="undefined")?function(str){return decodeURIComponent(str);}:function(str){return unescape(str).replace(/%2B/g,"+").replace(/%22/g,"\"").replace(/%27/g,"'").replace(/%2F/g,"/").replace(/%3D/g,"=");};function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}\r
+if(index>=0){arr.splice(index,1);return true;}else{return false;}}\r
+function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function extractBooleanFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return bool(param);}}\r
+function extractStringFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return String(param);}}\r
+function extractIntFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{try{var value=parseInt(param,10);return isNaN(value)?defaultValue:value;}catch(ex){logLog.warn("Invalid int param "+param,ex);return defaultValue;}}}\r
+function extractFunctionFromParam(param,defaultValue){if(typeof param=="function"){return param;}else{return defaultValue;}}\r
+function isError(err){return(err instanceof Error);}\r
+if(!Function.prototype.apply){Function.prototype.apply=function(obj,args){var methodName="__apply__";if(typeof obj[methodName]!="undefined"){methodName+=String(Math.random()).substr(2);}\r
+obj[methodName]=this;var argsStrings=[];for(var i=0,len=args.length;i<len;i++){argsStrings[i]="args["+i+"]";}\r
+var script="obj."+methodName+"("+argsStrings.join(",")+")";var returnValue=eval(script);delete obj[methodName];return returnValue;};}\r
+if(!Function.prototype.call){Function.prototype.call=function(obj){var args=[];for(var i=1,len=arguments.length;i<len;i++){args[i-1]=arguments[i];}\r
+return this.apply(obj,args);};}\r
+function getListenersPropertyName(eventName){return"__log4javascript_listeners__"+eventName;}\r
+function addEvent(node,eventName,listener,useCapture,win){win=win?win:window;if(node.addEventListener){node.addEventListener(eventName,listener,useCapture);}else if(node.attachEvent){node.attachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(!node[propertyName]){node[propertyName]=[];node["on"+eventName]=function(evt){evt=getEvent(evt,win);var listenersPropertyName=getListenersPropertyName(eventName);var listeners=this[listenersPropertyName].concat([]);var currentListener;while((currentListener=listeners.shift())){currentListener.call(this,evt);}};}\r
+node[propertyName].push(listener);}}\r
+function removeEvent(node,eventName,listener,useCapture){if(node.removeEventListener){node.removeEventListener(eventName,listener,useCapture);}else if(node.detachEvent){node.detachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(node[propertyName]){array_remove(node[propertyName],listener);}}}\r
+function getEvent(evt,win){win=win?win:window;return evt?evt:win.event;}\r
+function stopEventPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}\r
+evt.returnValue=false;}\r
+var logLog={quietMode:false,debugMessages:[],setQuietMode:function(quietMode){this.quietMode=bool(quietMode);},numberOfErrors:0,alertAllErrors:false,setAlertAllErrors:function(alertAllErrors){this.alertAllErrors=alertAllErrors;},debug:function(message){this.debugMessages.push(message);},displayDebug:function(){alert(this.debugMessages.join(newLine));},warn:function(message,exception){},error:function(message,exception){if(++this.numberOfErrors==1||this.alertAllErrors){if(!this.quietMode){var alertMessage="log4javascript error: "+message;if(exception){alertMessage+=newLine+newLine+"Original error: "+getExceptionStringRep(exception);}\r
+alert(alertMessage);}}}};log4javascript.logLog=logLog;log4javascript.setEventTypes(["load","error"]);function handleError(message,exception){logLog.error(message,exception);log4javascript.dispatchEvent("error",{"message":message,"exception":exception});}\r
+log4javascript.handleError=handleError;var enabled=!((typeof log4javascript_disabled!="undefined")&&log4javascript_disabled);log4javascript.setEnabled=function(enable){enabled=bool(enable);};log4javascript.isEnabled=function(){return enabled;};var useTimeStampsInMilliseconds=true;log4javascript.setTimeStampsInMilliseconds=function(timeStampsInMilliseconds){useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);};log4javascript.isTimeStampsInMilliseconds=function(){return useTimeStampsInMilliseconds;};log4javascript.evalInScope=function(expr){return eval(expr);};var showStackTraces=false;log4javascript.setShowStackTraces=function(show){showStackTraces=bool(show);};var Level=function(level,name){this.level=level;this.name=name;};Level.prototype={toString:function(){return this.name;},equals:function(level){return this.level==level.level;},isGreaterOrEqual:function(level){return this.level>=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}\r
+Timer.prototype.getElapsedTime=function(){return new Date().getTime()-this.start.getTime();};var anonymousLoggerName="[anonymous]";var defaultLoggerName="[default]";var nullLoggerName="[null]";var rootLoggerName="root";function Logger(name){this.name=name;this.parent=null;this.children=[];var appenders=[];var loggerLevel=null;var isRoot=(this.name===rootLoggerName);var isNull=(this.name===nullLoggerName);var appenderCache=null;var appenderCacheInvalidated=false;this.addChild=function(childLogger){this.children.push(childLogger);childLogger.parent=this;childLogger.invalidateAppenderCache();};var additive=true;this.getAdditivity=function(){return additive;};this.setAdditivity=function(additivity){var valueChanged=(additive!=additivity);additive=additivity;if(valueChanged){this.invalidateAppenderCache();}};this.addAppender=function(appender){if(isNull){handleError("Logger.addAppender: you may not add an appender to the null logger");}else{if(appender instanceof log4javascript.Appender){if(!array_contains(appenders,appender)){appenders.push(appender);appender.setAddedToLogger(this);this.invalidateAppenderCache();}}else{handleError("Logger.addAppender: appender supplied ('"+\r
+toStr(appender)+"') is not a subclass of Appender");}}};this.removeAppender=function(appender){array_remove(appenders,appender);appender.setRemovedFromLogger(this);this.invalidateAppenderCache();};this.removeAllAppenders=function(){var appenderCount=appenders.length;if(appenderCount>0){for(var i=0;i<appenderCount;i++){appenders[i].setRemovedFromLogger(this);}\r
+appenders.length=0;this.invalidateAppenderCache();}};this.getEffectiveAppenders=function(){if(appenderCache===null||appenderCacheInvalidated){var parentEffectiveAppenders=(isRoot||!this.getAdditivity())?[]:this.parent.getEffectiveAppenders();appenderCache=parentEffectiveAppenders.concat(appenders);appenderCacheInvalidated=false;}\r
+return appenderCache;};this.invalidateAppenderCache=function(){appenderCacheInvalidated=true;for(var i=0,len=this.children.length;i<len;i++){this.children[i].invalidateAppenderCache();}};this.log=function(level,params){if(enabled&&level.isGreaterOrEqual(this.getEffectiveLevel())){var exception;var finalParamIndex=params.length-1;var lastParam=params[finalParamIndex];if(params.length>1&&isError(lastParam)){exception=lastParam;finalParamIndex--;}\r
+var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];}\r
+var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this.callAppenders(loggingEvent);}};this.callAppenders=function(loggingEvent){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].doAppend(loggingEvent);}};this.setLevel=function(level){if(isRoot&&level===null){handleError("Logger.setLevel: you cannot set the level of the root logger to null");}else if(level instanceof Level){loggerLevel=level;}else{handleError("Logger.setLevel: level supplied to logger "+\r
+this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].group(name,initiallyExpanded);}}};this.groupEnd=function(){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].groupEnd();}}};var timers={};this.time=function(name,level){if(enabled){if(isUndefined(name)){handleError("Logger.time: a name for the timer must be supplied");}else if(level&&!(level instanceof Level)){handleError("Logger.time: level supplied to timer "+\r
+name+" is not an instance of log4javascript.Level");}else{timers[name]=new Timer(name,level);}}};this.timeEnd=function(name){if(enabled){if(isUndefined(name)){handleError("Logger.timeEnd: a name for the timer must be supplied");}else if(timers[name]){var timer=timers[name];var milliseconds=timer.getElapsedTime();this.log(timer.level,["Timer "+toStr(name)+" completed in "+milliseconds+"ms"]);delete timers[name];}else{logLog.warn("Logger.timeEnd: no timer found with name "+name);}}};this.assert=function(expr){if(enabled&&!expr){var args=[];for(var i=1,len=arguments.length;i<len;i++){args.push(arguments[i]);}\r
+args=(args.length>0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}\r
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+\r
+toStr(loggerName)+" supplied, returning anonymous logger");}\r
+if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}\r
+if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}\r
+parentLogger.addChild(logger);}\r
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}\r
+return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}\r
+return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}\r
+if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}\r
+if(this.hasCustomFields()){for(var i=0,len=this.customFields.length;i<len;i++){var val=this.customFields[i].value;if(typeof val==="function"){val=val(this,loggingEvent);}\r
+dataValues.push([this.customFields[i].name,val]);}}\r
+return dataValues;},setKeys:function(loggerKey,timeStampKey,levelKey,messageKey,exceptionKey,urlKey,millisecondsKey){this.loggerKey=extractStringFromParam(loggerKey,this.defaults.loggerKey);this.timeStampKey=extractStringFromParam(timeStampKey,this.defaults.timeStampKey);this.levelKey=extractStringFromParam(levelKey,this.defaults.levelKey);this.messageKey=extractStringFromParam(messageKey,this.defaults.messageKey);this.exceptionKey=extractStringFromParam(exceptionKey,this.defaults.exceptionKey);this.urlKey=extractStringFromParam(urlKey,this.defaults.urlKey);this.millisecondsKey=extractStringFromParam(millisecondsKey,this.defaults.millisecondsKey);},setCustomField:function(name,value){var fieldUpdated=false;for(var i=0,len=this.customFields.length;i<len;i++){if(this.customFields[i].name===name){this.customFields[i].value=value;fieldUpdated=true;}}\r
+if(!fieldUpdated){this.customFields.push({"name":name,"value":value});}},hasCustomFields:function(){return(this.customFields.length>0);},toString:function(){handleError("Layout.toString: all layouts must override this method");}};log4javascript.Layout=Layout;var Appender=function(){};Appender.prototype=new EventSupport();Appender.prototype.layout=new PatternLayout();Appender.prototype.threshold=Level.ALL;Appender.prototype.loggers=[];Appender.prototype.doAppend=function(loggingEvent){if(enabled&&loggingEvent.level.level>=this.threshold.level){this.append(loggingEvent);}};Appender.prototype.append=function(loggingEvent){};Appender.prototype.setLayout=function(layout){if(layout instanceof Layout){this.layout=layout;}else{handleError("Appender.setLayout: layout supplied to "+\r
+this.toString()+" is not a subclass of Layout");}};Appender.prototype.getLayout=function(){return this.layout;};Appender.prototype.setThreshold=function(threshold){if(threshold instanceof Level){this.threshold=threshold;}else{handleError("Appender.setThreshold: threshold supplied to "+\r
+this.toString()+" is not a subclass of Level");}};Appender.prototype.getThreshold=function(){return this.threshold;};Appender.prototype.setAddedToLogger=function(logger){this.loggers.push(logger);};Appender.prototype.setRemovedFromLogger=function(logger){array_remove(this.loggers,logger);};Appender.prototype.group=emptyFunction;Appender.prototype.groupEnd=emptyFunction;Appender.prototype.toString=function(){handleError("Appender.toString: all appenders must override this method");};log4javascript.Appender=Appender;function SimpleLayout(){this.customFields=[];}\r
+SimpleLayout.prototype=new Layout();SimpleLayout.prototype.format=function(loggingEvent){return loggingEvent.level.name+" - "+loggingEvent.getCombinedMessages();};SimpleLayout.prototype.ignoresThrowable=function(){return true;};SimpleLayout.prototype.toString=function(){return"SimpleLayout";};log4javascript.SimpleLayout=SimpleLayout;function NullLayout(){this.customFields=[];}\r
+NullLayout.prototype=new Layout();NullLayout.prototype.format=function(loggingEvent){return loggingEvent.messages;};NullLayout.prototype.ignoresThrowable=function(){return true;};NullLayout.prototype.toString=function(){return"NullLayout";};log4javascript.NullLayout=NullLayout;function XmlLayout(combineMessages){this.combineMessages=extractBooleanFromParam(combineMessages,true);this.customFields=[];}\r
+XmlLayout.prototype=new Layout();XmlLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};XmlLayout.prototype.getContentType=function(){return"text/xml";};XmlLayout.prototype.escapeCdata=function(str){return str.replace(/\]\]>/,"]]>]]&gt;<![CDATA[");};XmlLayout.prototype.format=function(loggingEvent){var layout=this;var i,len;function formatMessage(message){message=(typeof message==="string")?message:toStr(message);return"<log4javascript:message><![CDATA["+\r
+layout.escapeCdata(message)+"]]></log4javascript:message>";}\r
+var str="<log4javascript:event logger=\""+loggingEvent.logger.name+"\" timestamp=\""+this.getTimeStampValue(loggingEvent)+"\"";if(!this.isTimeStampsInMilliseconds()){str+=" milliseconds=\""+loggingEvent.milliseconds+"\"";}\r
+str+=" level=\""+loggingEvent.level.name+"\">"+newLine;if(this.combineMessages){str+=formatMessage(loggingEvent.getCombinedMessages());}else{str+="<log4javascript:messages>"+newLine;for(i=0,len=loggingEvent.messages.length;i<len;i++){str+=formatMessage(loggingEvent.messages[i])+newLine;}\r
+str+="</log4javascript:messages>"+newLine;}\r
+if(this.hasCustomFields()){for(i=0,len=this.customFields.length;i<len;i++){str+="<log4javascript:customfield name=\""+\r
+this.customFields[i].name+"\"><![CDATA["+\r
+this.customFields[i].value.toString()+"]]></log4javascript:customfield>"+newLine;}}\r
+if(loggingEvent.exception){str+="<log4javascript:exception><![CDATA["+\r
+getExceptionStringRep(loggingEvent.exception)+"]]></log4javascript:exception>"+newLine;}\r
+str+="</log4javascript:event>"+newLine+newLine;return str;};XmlLayout.prototype.ignoresThrowable=function(){return false;};XmlLayout.prototype.toString=function(){return"XmlLayout";};log4javascript.XmlLayout=XmlLayout;function escapeNewLines(str){return str.replace(/\r\n|\r|\n/g,"\\r\\n");}\r
+function JsonLayout(readable,combineMessages){this.readable=extractBooleanFromParam(readable,false);this.combineMessages=extractBooleanFromParam(combineMessages,true);this.batchHeader=this.readable?"["+newLine:"[";this.batchFooter=this.readable?"]"+newLine:"]";this.batchSeparator=this.readable?","+newLine:",";this.setKeys();this.colon=this.readable?": ":":";this.tab=this.readable?"\t":"";this.lineBreak=this.readable?newLine:"";this.customFields=[];}\r
+JsonLayout.prototype=new Layout();JsonLayout.prototype.isReadable=function(){return this.readable;};JsonLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};JsonLayout.prototype.format=function(loggingEvent){var layout=this;var dataValues=this.getDataValues(loggingEvent,this.combineMessages);var str="{"+this.lineBreak;var i,len;function formatValue(val,prefix,expand){var formattedValue;var valType=typeof val;if(val instanceof Date){formattedValue=String(val.getTime());}else if(expand&&(val instanceof Array)){formattedValue="["+layout.lineBreak;for(var i=0,len=val.length;i<len;i++){var childPrefix=prefix+layout.tab;formattedValue+=childPrefix+formatValue(val[i],childPrefix,false);if(i<val.length-1){formattedValue+=",";}\r
+formattedValue+=layout.lineBreak;}\r
+formattedValue+=prefix+"]";}else if(valType!=="number"&&valType!=="boolean"){formattedValue="\""+escapeNewLines(toStr(val).replace(/\"/g,"\\\""))+"\"";}else{formattedValue=val;}\r
+return formattedValue;}\r
+for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+"\""+this.colon+formatValue(dataValues[i][1],this.tab,true);if(i<len){str+=",";}\r
+str+=this.lineBreak;}\r
+str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}\r
+HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i<len;i++){var val=(dataValues[i][1]instanceof Date)?String(dataValues[i][1].getTime()):dataValues[i][1];queryBits.push(urlEncode(dataValues[i][0])+"="+urlEncode(val));}\r
+return queryBits.join("&");};HttpPostDataLayout.prototype.ignoresThrowable=function(loggingEvent){return false;};HttpPostDataLayout.prototype.toString=function(){return"HttpPostDataLayout";};log4javascript.HttpPostDataLayout=HttpPostDataLayout;function formatObjectExpansion(obj,depth,indentation){var objectsExpanded=[];function doFormat(obj,depth,indentation){var i,j,len,childDepth,childIndentation,childLines,expansion,childExpansion;if(!indentation){indentation="";}\r
+function formatString(text){var lines=splitIntoLines(text);for(var j=1,jLen=lines.length;j<jLen;j++){lines[j]=indentation+lines[j];}\r
+return lines.join(newLine);}\r
+if(obj===null){return"null";}else if(typeof obj=="undefined"){return"undefined";}else if(typeof obj=="string"){return formatString(obj);}else if(typeof obj=="object"&&array_contains(objectsExpanded,obj)){try{expansion=toStr(obj);}catch(ex){expansion="Error formatting property. Details: "+getExceptionStringRep(ex);}\r
+return expansion+" [already expanded]";}else if((obj instanceof Array)&&depth>0){objectsExpanded.push(obj);expansion="["+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i=0,len=obj.length;i<len;i++){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+childExpansion);}catch(ex){childLines.push(childIndentation+"Error formatting array member. Details: "+\r
+getExceptionStringRep(ex)+"");}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"]";return expansion;}else if(Object.prototype.toString.call(obj)=="[object Date]"){return obj.toString();}else if(typeof obj=="object"&&depth>0){objectsExpanded.push(obj);expansion="{"+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i in obj){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+i+": "+childExpansion);}catch(ex){childLines.push(childIndentation+i+": Error formatting property. Details: "+\r
+getExceptionStringRep(ex));}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"}";return expansion;}else{return formatString(toStr(obj));}}\r
+return doFormat(obj,depth,indentation);}\r
+var SimpleDateFormat;(function(){var regex=/('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;var monthNames=["January","February","March","April","May","June","July","August","September","October","November","December"];var dayNames=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var TEXT2=0,TEXT3=1,NUMBER=2,YEAR=3,MONTH=4,TIMEZONE=5;var types={G:TEXT2,y:YEAR,M:MONTH,w:NUMBER,W:NUMBER,D:NUMBER,d:NUMBER,F:NUMBER,E:TEXT3,a:TEXT2,H:NUMBER,k:NUMBER,K:NUMBER,h:NUMBER,m:NUMBER,s:NUMBER,S:NUMBER,Z:TIMEZONE};var ONE_DAY=24*60*60*1000;var ONE_WEEK=7*ONE_DAY;var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK=1;var newDateAtMidnight=function(year,month,day){var d=new Date(year,month,day,0,0,0);d.setMilliseconds(0);return d;};Date.prototype.getDifference=function(date){return this.getTime()-date.getTime();};Date.prototype.isBefore=function(d){return this.getTime()<d.getTime();};Date.prototype.getUTCTime=function(){return Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());};Date.prototype.getTimeSince=function(d){return this.getUTCTime()-d.getUTCTime();};Date.prototype.getPreviousSunday=function(){var midday=new Date(this.getFullYear(),this.getMonth(),this.getDate(),12,0,0);var previousSunday=new Date(midday.getTime()-this.getDay()*ONE_DAY);return newDateAtMidnight(previousSunday.getFullYear(),previousSunday.getMonth(),previousSunday.getDate());};Date.prototype.getWeekInYear=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);var numberOfSundays=previousSunday.isBefore(startOfYear)?0:1+Math.floor(previousSunday.getTimeSince(startOfYear)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfYear.getDay();var weekInYear=numberOfSundays;if(numberOfDaysInFirstWeek<minimalDaysInFirstWeek){weekInYear--;}\r
+return weekInYear;};Date.prototype.getWeekInMonth=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfMonth=newDateAtMidnight(this.getFullYear(),this.getMonth(),1);var numberOfSundays=previousSunday.isBefore(startOfMonth)?0:1+Math.floor(previousSunday.getTimeSince(startOfMonth)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfMonth.getDay();var weekInMonth=numberOfSundays;if(numberOfDaysInFirstWeek>=minimalDaysInFirstWeek){weekInMonth++;}\r
+return weekInMonth;};Date.prototype.getDayInYear=function(){var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);return 1+Math.floor(this.getTimeSince(startOfYear)/ONE_DAY);};SimpleDateFormat=function(formatString){this.formatString=formatString;};SimpleDateFormat.prototype.setMinimalDaysInFirstWeek=function(days){this.minimalDaysInFirstWeek=days;};SimpleDateFormat.prototype.getMinimalDaysInFirstWeek=function(){return isUndefined(this.minimalDaysInFirstWeek)?DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK:this.minimalDaysInFirstWeek;};var padWithZeroes=function(str,len){while(str.length<len){str="0"+str;}\r
+return str;};var formatText=function(data,numberOfLetters,minLength){return(numberOfLetters>=4)?data:data.substr(0,Math.max(minLength,numberOfLetters));};var formatNumber=function(data,numberOfLetters){var dataString=""+data;return padWithZeroes(dataString,numberOfLetters);};SimpleDateFormat.prototype.format=function(date){var formattedString="";var result;var searchString=this.formatString;while((result=regex.exec(searchString))){var quotedString=result[1];var patternLetters=result[2];var otherLetters=result[3];var otherCharacters=result[4];if(quotedString){if(quotedString=="''"){formattedString+="'";}else{formattedString+=quotedString.substring(1,quotedString.length-1);}}else if(otherLetters){}else if(otherCharacters){formattedString+=otherCharacters;}else if(patternLetters){var patternLetter=patternLetters.charAt(0);var numberOfLetters=patternLetters.length;var rawData="";switch(patternLetter){case"G":rawData="AD";break;case"y":rawData=date.getFullYear();break;case"M":rawData=date.getMonth();break;case"w":rawData=date.getWeekInYear(this.getMinimalDaysInFirstWeek());break;case"W":rawData=date.getWeekInMonth(this.getMinimalDaysInFirstWeek());break;case"D":rawData=date.getDayInYear();break;case"d":rawData=date.getDate();break;case"F":rawData=1+Math.floor((date.getDate()-1)/7);break;case"E":rawData=dayNames[date.getDay()];break;case"a":rawData=(date.getHours()>=12)?"PM":"AM";break;case"H":rawData=date.getHours();break;case"k":rawData=date.getHours()||24;break;case"K":rawData=date.getHours()%12;break;case"h":rawData=(date.getHours()%12)||12;break;case"m":rawData=date.getMinutes();break;case"s":rawData=date.getSeconds();break;case"S":rawData=date.getMilliseconds();break;case"Z":rawData=date.getTimezoneOffset();break;}\r
+switch(types[patternLetter]){case TEXT2:formattedString+=formatText(rawData,numberOfLetters,2);break;case TEXT3:formattedString+=formatText(rawData,numberOfLetters,3);break;case NUMBER:formattedString+=formatNumber(rawData,numberOfLetters);break;case YEAR:if(numberOfLetters<=3){var dataString=""+rawData;formattedString+=dataString.substr(2,2);}else{formattedString+=formatNumber(rawData,numberOfLetters);}\r
+break;case MONTH:if(numberOfLetters>=3){formattedString+=formatText(monthNames[rawData],numberOfLetters,numberOfLetters);}else{formattedString+=formatNumber(rawData+1,numberOfLetters);}\r
+break;case TIMEZONE:var isPositive=(rawData>0);var prefix=isPositive?"-":"+";var absData=Math.abs(rawData);var hours=""+Math.floor(absData/60);hours=padWithZeroes(hours,2);var minutes=""+(absData%60);minutes=padWithZeroes(minutes,2);formattedString+=prefix+hours+minutes;break;}}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};})();log4javascript.SimpleDateFormat=SimpleDateFormat;function PatternLayout(pattern){if(pattern){this.pattern=pattern;}else{this.pattern=PatternLayout.DEFAULT_CONVERSION_PATTERN;}\r
+this.customFields=[];}\r
+PatternLayout.TTCC_CONVERSION_PATTERN="%r %p %c - %m%n";PatternLayout.DEFAULT_CONVERSION_PATTERN="%m%n";PatternLayout.ISO8601_DATEFORMAT="yyyy-MM-dd HH:mm:ss,SSS";PatternLayout.DATETIME_DATEFORMAT="dd MMM yyyy HH:mm:ss,SSS";PatternLayout.ABSOLUTETIME_DATEFORMAT="HH:mm:ss,SSS";PatternLayout.prototype=new Layout();PatternLayout.prototype.format=function(loggingEvent){var regex=/%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;var formattedString="";var result;var searchString=this.pattern;while((result=regex.exec(searchString))){var matchedString=result[0];var padding=result[1];var truncation=result[2];var conversionCharacter=result[3];var specifier=result[5];var text=result[6];if(text){formattedString+=""+text;}else{var replacement="";switch(conversionCharacter){case"a":case"m":var depth=0;if(specifier){depth=parseInt(specifier,10);if(isNaN(depth)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character '"+conversionCharacter+"' - should be a number");depth=0;}}\r
+var messages=(conversionCharacter==="a")?loggingEvent.messages[0]:loggingEvent.messages;for(var i=0,len=messages.length;i<len;i++){if(i>0&&(replacement.charAt(replacement.length-1)!==" ")){replacement+=" ";}\r
+if(depth===0){replacement+=messages[i];}else{replacement+=formatObjectExpansion(messages[i],depth);}}\r
+break;case"c":var loggerName=loggingEvent.logger.name;if(specifier){var precision=parseInt(specifier,10);var loggerNameBits=loggingEvent.logger.name.split(".");if(precision>=loggerNameBits.length){replacement=loggerName;}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".");}}else{replacement=loggerName;}\r
+break;case"d":var dateFormat=PatternLayout.ISO8601_DATEFORMAT;if(specifier){dateFormat=specifier;if(dateFormat=="ISO8601"){dateFormat=PatternLayout.ISO8601_DATEFORMAT;}else if(dateFormat=="ABSOLUTE"){dateFormat=PatternLayout.ABSOLUTETIME_DATEFORMAT;}else if(dateFormat=="DATE"){dateFormat=PatternLayout.DATETIME_DATEFORMAT;}}\r
+replacement=(new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);break;case"f":if(this.hasCustomFields()){var fieldIndex=0;if(specifier){fieldIndex=parseInt(specifier,10);if(isNaN(fieldIndex)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - should be a number");}else if(fieldIndex===0){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - must be greater than zero");}else if(fieldIndex>this.customFields.length){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - there aren't that many custom fields");}else{fieldIndex=fieldIndex-1;}}\r
+var val=this.customFields[fieldIndex].value;if(typeof val=="function"){val=val(this,loggingEvent);}\r
+replacement=val;}\r
+break;case"n":replacement=newLine;break;case"p":replacement=loggingEvent.level.name;break;case"r":replacement=""+loggingEvent.timeStamp.getDifference(applicationStartDate);break;case"%":replacement="%";break;default:replacement=matchedString;break;}\r
+var l;if(truncation){l=parseInt(truncation.substr(1),10);var strLen=replacement.length;if(l<strLen){replacement=replacement.substring(strLen-l,strLen);}}\r
+if(padding){if(padding.charAt(0)=="-"){l=parseInt(padding.substr(1),10);while(replacement.length<l){replacement+=" ";}}else{l=parseInt(padding,10);while(replacement.length<l){replacement=" "+replacement;}}}\r
+formattedString+=replacement;}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};PatternLayout.prototype.ignoresThrowable=function(){return true;};PatternLayout.prototype.toString=function(){return"PatternLayout";};log4javascript.PatternLayout=PatternLayout;function AlertAppender(){}\r
+AlertAppender.prototype=new Appender();AlertAppender.prototype.layout=new SimpleLayout();AlertAppender.prototype.append=function(loggingEvent){var formattedMessage=this.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+alert(formattedMessage);};AlertAppender.prototype.toString=function(){return"AlertAppender";};log4javascript.AlertAppender=AlertAppender;function BrowserConsoleAppender(){}\r
+BrowserConsoleAppender.prototype=new log4javascript.Appender();BrowserConsoleAppender.prototype.layout=new NullLayout();BrowserConsoleAppender.prototype.threshold=Level.DEBUG;BrowserConsoleAppender.prototype.append=function(loggingEvent){var appender=this;var getFormattedMessage=function(){var layout=appender.getLayout();var formattedMessage=layout.format(loggingEvent);if(layout.ignoresThrowable()&&loggingEvent.exception){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+return formattedMessage;};if((typeof opera!="undefined")&&opera.postError){opera.postError(getFormattedMessage());}else if(window.console&&window.console.log){var formattedMesage=getFormattedMessage();if(window.console.debug&&Level.DEBUG.isGreaterOrEqual(loggingEvent.level)){window.console.debug(formattedMesage);}else if(window.console.info&&Level.INFO.equals(loggingEvent.level)){window.console.info(formattedMesage);}else if(window.console.warn&&Level.WARN.equals(loggingEvent.level)){window.console.warn(formattedMesage);}else if(window.console.error&&loggingEvent.level.isGreaterOrEqual(Level.ERROR)){window.console.error(formattedMesage);}else{window.console.log(formattedMesage);}}};BrowserConsoleAppender.prototype.group=function(name){if(window.console&&window.console.group){window.console.group(name);}};BrowserConsoleAppender.prototype.groupEnd=function(){if(window.console&&window.console.groupEnd){window.console.groupEnd();}};BrowserConsoleAppender.prototype.toString=function(){return"BrowserConsoleAppender";};log4javascript.BrowserConsoleAppender=BrowserConsoleAppender;var xmlHttpFactories=[function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];var getXmlHttp=function(errorHandler){var xmlHttp=null,factory;for(var i=0,len=xmlHttpFactories.length;i<len;i++){factory=xmlHttpFactories[i];try{xmlHttp=factory();getXmlHttp=factory;return xmlHttp;}catch(e){}}\r
+if(errorHandler){errorHandler();}else{handleError("getXmlHttp: unable to obtain XMLHttpRequest object");}};function isHttpRequestSuccessful(xmlHttp){return isUndefined(xmlHttp.status)||xmlHttp.status===0||(xmlHttp.status>=200&&xmlHttp.status<300)||xmlHttp.status==1223;}\r
+function AjaxAppender(url){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;}\r
+var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var contentType=this.defaults.contentType;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var headers=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+\r
+configOptionName+"' may not be set after the appender has been initialized");return false;}\r
+return true;}\r
+this.getSessionId=function(){return sessionId;};this.setSessionId=function(sessionIdParam){sessionId=extractStringFromParam(sessionIdParam,null);this.layout.setCustomField("sessionid",sessionId);};this.setLayout=function(layoutParam){if(checkCanConfigure("layout")){this.layout=layoutParam;if(sessionId!==null){this.setSessionId(sessionId);}}};this.isTimed=function(){return timed;};this.setTimed=function(timedParam){if(checkCanConfigure("timed")){timed=bool(timedParam);}};this.getTimerInterval=function(){return timerInterval;};this.setTimerInterval=function(timerIntervalParam){if(checkCanConfigure("timerInterval")){timerInterval=extractIntFromParam(timerIntervalParam,timerInterval);}};this.isWaitForResponse=function(){return waitForResponse;};this.setWaitForResponse=function(waitForResponseParam){if(checkCanConfigure("waitForResponse")){waitForResponse=bool(waitForResponseParam);}};this.getBatchSize=function(){return batchSize;};this.setBatchSize=function(batchSizeParam){if(checkCanConfigure("batchSize")){batchSize=extractIntFromParam(batchSizeParam,batchSize);}};this.isSendAllOnUnload=function(){return sendAllOnUnload;};this.setSendAllOnUnload=function(sendAllOnUnloadParam){if(checkCanConfigure("sendAllOnUnload")){sendAllOnUnload=extractBooleanFromParam(sendAllOnUnloadParam,sendAllOnUnload);}};this.setRequestSuccessCallback=function(requestSuccessCallbackParam){requestSuccessCallback=extractFunctionFromParam(requestSuccessCallbackParam,requestSuccessCallback);};this.setFailCallback=function(failCallbackParam){failCallback=extractFunctionFromParam(failCallbackParam,failCallback);};this.getPostVarName=function(){return postVarName;};this.setPostVarName=function(postVarNameParam){if(checkCanConfigure("postVarName")){postVarName=extractStringFromParam(postVarNameParam,postVarName);}};this.getHeaders=function(){return headers;};this.addHeader=function(name,value){if(name.toLowerCase()=="content-type"){contentType=value;}else{headers.push({name:name,value:value});}};function sendAll(){if(isSupported&&enabled){sending=true;var currentRequestBatch;if(waitForResponse){if(queuedRequests.length>0){currentRequestBatch=queuedRequests.shift();sendRequest(preparePostData(currentRequestBatch),sendAll);}else{sending=false;if(timed){scheduleSending();}}}else{while((currentRequestBatch=queuedRequests.shift())){sendRequest(preparePostData(currentRequestBatch));}\r
+sending=false;if(timed){scheduleSending();}}}}\r
+this.sendAll=sendAll;function sendAllRemaining(){var sendingAnything=false;if(isSupported&&enabled){var actualBatchSize=appender.getLayout().allowBatching()?batchSize:1;var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);if(queuedLoggingEvents.length>=actualBatchSize){queuedRequests.push(batchedLoggingEvents);batchedLoggingEvents=[];}}\r
+if(batchedLoggingEvents.length>0){queuedRequests.push(batchedLoggingEvents);}\r
+sendingAnything=(queuedRequests.length>0);waitForResponse=false;timed=false;sendAll();}\r
+return sendingAnything;}\r
+this.sendAllRemaining=sendAllRemaining;function preparePostData(batchedLoggingEvents){var formattedMessages=[];var currentLoggingEvent;var postData="";while((currentLoggingEvent=batchedLoggingEvents.shift())){var currentFormattedMessage=appender.getLayout().format(currentLoggingEvent);if(appender.getLayout().ignoresThrowable()){currentFormattedMessage+=currentLoggingEvent.getThrowableStrRep();}\r
+formattedMessages.push(currentFormattedMessage);}\r
+if(batchedLoggingEvents.length==1){postData=formattedMessages.join("");}else{postData=appender.getLayout().batchHeader+\r
+formattedMessages.join(appender.getLayout().batchSeparator)+\r
+appender.getLayout().batchFooter;}\r
+if(contentType==appender.defaults.contentType){postData=appender.getLayout().returnsPostData?postData:urlEncode(postVarName)+"="+urlEncode(postData);if(postData.length>0){postData+="&";}\r
+postData+="layout="+urlEncode(appender.getLayout().toString());}\r
+return postData;}\r
+function scheduleSending(){window.setTimeout(sendAll,timerInterval);}\r
+function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}}\r
+function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(xmlHttp.overrideMimeType){xmlHttp.overrideMimeType(appender.getLayout().getContentType());}\r
+xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}\r
+if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+\r
+url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}}\r
+xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}\r
+xmlHttp.setRequestHeader("Content-Type",contentType);}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}\r
+return;}\r
+xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}}\r
+this.append=function(loggingEvent){if(isSupported){if(!initialized){init();}\r
+queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}\r
+queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}\r
+if(sendAllRemaining()){return"Sending log messages";}};}\r
+if(timed){scheduleSending();}}}\r
+AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function setCookie(name,value,days,path){var expires;path=path?"; path="+path:"";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";}\r
+document.cookie=escape(name)+"="+escape(value)+expires+path;}\r
+function getCookie(name){var nameEquals=escape(name)+"=";var ca=document.cookie.split(";");for(var i=0,len=ca.length;i<len;i++){var c=ca[i];while(c.charAt(0)===" "){c=c.substring(1,c.length);}\r
+if(c.indexOf(nameEquals)===0){return unescape(c.substring(nameEquals.length,c.length));}}\r
+return null;}\r
+function getBaseUrl(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i<len;++i){if(scripts[i].src.indexOf("log4javascript")!=-1){var lastSlash=scripts[i].src.lastIndexOf("/");return(lastSlash==-1)?"":scripts[i].src.substr(0,lastSlash+1);}}\r
+return null;}\r
+function isLoaded(win){try{return bool(win.loaded);}catch(ex){return false;}}\r
+var ConsoleAppender;(function(){var getConsoleHtmlLines=function(){return['<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">','<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">','<head>','<title>log4javascript</title>','<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />','<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->','<meta http-equiv="X-UA-Compatible" content="IE=7" />','<script type="text/javascript">var isIe = false, isIePre7 = false;</script>','<!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->','<!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->','<script type="text/javascript">','//<![CDATA[','var loggingEnabled=true;var logQueuedEventsTimer=null;var logEntries=[];var logEntriesAndSeparators=[];var logItems=[];var renderDelay=100;var unrenderedLogItemsExist=false;var rootGroup,currentGroup=null;var loaded=false;var currentLogItem=null;var logMainContainer;function copyProperties(obj,props){for(var i in props){obj[i]=props[i];}}','function LogItem(){}','LogItem.prototype={mainContainer:null,wrappedContainer:null,unwrappedContainer:null,group:null,appendToLog:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].appendToLog();}','this.group.update();},doRemove:function(doUpdate,removeFromGroup){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].remove();}','this.unwrappedElementContainer=null;this.wrappedElementContainer=null;this.mainElementContainer=null;}','if(this.group&&removeFromGroup){this.group.removeChild(this,doUpdate);}','if(this===currentLogItem){currentLogItem=null;}},remove:function(doUpdate,removeFromGroup){this.doRemove(doUpdate,removeFromGroup);},render:function(){},accept:function(visitor){visitor.visit(this);},getUnwrappedDomContainer:function(){return this.group.unwrappedElementContainer.contentDiv;},getWrappedDomContainer:function(){return this.group.wrappedElementContainer.contentDiv;},getMainDomContainer:function(){return this.group.mainElementContainer.contentDiv;}};LogItem.serializedItemKeys={LOG_ENTRY:0,GROUP_START:1,GROUP_END:2};function LogItemContainerElement(){}','LogItemContainerElement.prototype={appendToLog:function(){var insertBeforeFirst=(newestAtTop&&this.containerDomNode.hasChildNodes());if(insertBeforeFirst){this.containerDomNode.insertBefore(this.mainDiv,this.containerDomNode.firstChild);}else{this.containerDomNode.appendChild(this.mainDiv);}}};function SeparatorElementContainer(containerDomNode){this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="separator";this.mainDiv.innerHTML="&nbsp;";}','SeparatorElementContainer.prototype=new LogItemContainerElement();SeparatorElementContainer.prototype.remove=function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;};function Separator(){this.rendered=false;}','Separator.prototype=new LogItem();copyProperties(Separator.prototype,{render:function(){var containerDomNode=this.group.contentDiv;if(isIe){this.unwrappedElementContainer=new SeparatorElementContainer(this.getUnwrappedDomContainer());this.wrappedElementContainer=new SeparatorElementContainer(this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new SeparatorElementContainer(this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}','this.content=this.formattedMessage;this.rendered=true;}});function GroupElementContainer(group,containerDomNode,isRoot,isWrapped){this.group=group;this.containerDomNode=containerDomNode;this.isRoot=isRoot;this.isWrapped=isWrapped;this.expandable=false;if(this.isRoot){if(isIe){this.contentDiv=logMainContainer.appendChild(document.createElement("div"));this.contentDiv.id=this.isWrapped?"log_wrapped":"log_unwrapped";}else{this.contentDiv=logMainContainer;}}else{var groupElementContainer=this;this.mainDiv=document.createElement("div");this.mainDiv.className="group";this.headingDiv=this.mainDiv.appendChild(document.createElement("div"));this.headingDiv.className="groupheading";this.expander=this.headingDiv.appendChild(document.createElement("span"));this.expander.className="expander unselectable greyedout";this.expander.unselectable=true;var expanderText=this.group.expanded?"-":"+";this.expanderTextNode=this.expander.appendChild(document.createTextNode(expanderText));this.headingDiv.appendChild(document.createTextNode(" "+this.group.name));this.contentDiv=this.mainDiv.appendChild(document.createElement("div"));var contentCssClass=this.group.expanded?"expanded":"collapsed";this.contentDiv.className="groupcontent "+contentCssClass;this.expander.onclick=function(){if(groupElementContainer.group.expandable){groupElementContainer.group.toggleExpanded();}};}}','GroupElementContainer.prototype=new LogItemContainerElement();copyProperties(GroupElementContainer.prototype,{toggleExpanded:function(){if(!this.isRoot){var oldCssClass,newCssClass,expanderText;if(this.group.expanded){newCssClass="expanded";oldCssClass="collapsed";expanderText="-";}else{newCssClass="collapsed";oldCssClass="expanded";expanderText="+";}','replaceClass(this.contentDiv,newCssClass,oldCssClass);this.expanderTextNode.nodeValue=expanderText;}},remove:function(){if(!this.isRoot){this.headingDiv=null;this.expander.onclick=null;this.expander=null;this.expanderTextNode=null;this.contentDiv=null;this.containerDomNode=null;this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;}},reverseChildren:function(){var node=null;var childDomNodes=[];while((node=this.contentDiv.firstChild)){this.contentDiv.removeChild(node);childDomNodes.push(node);}','while((node=childDomNodes.pop())){this.contentDiv.appendChild(node);}},update:function(){if(!this.isRoot){if(this.group.expandable){removeClass(this.expander,"greyedout");}else{addClass(this.expander,"greyedout");}}},clear:function(){if(this.isRoot){this.contentDiv.innerHTML="";}}});function Group(name,isRoot,initiallyExpanded){this.name=name;this.group=null;this.isRoot=isRoot;this.initiallyExpanded=initiallyExpanded;this.elementContainers=[];this.children=[];this.expanded=initiallyExpanded;this.rendered=false;this.expandable=false;}','Group.prototype=new LogItem();copyProperties(Group.prototype,{addChild:function(logItem){this.children.push(logItem);logItem.group=this;},render:function(){if(isIe){var unwrappedDomContainer,wrappedDomContainer;if(this.isRoot){unwrappedDomContainer=logMainContainer;wrappedDomContainer=logMainContainer;}else{unwrappedDomContainer=this.getUnwrappedDomContainer();wrappedDomContainer=this.getWrappedDomContainer();}','this.unwrappedElementContainer=new GroupElementContainer(this,unwrappedDomContainer,this.isRoot,false);this.wrappedElementContainer=new GroupElementContainer(this,wrappedDomContainer,this.isRoot,true);this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{var mainDomContainer=this.isRoot?logMainContainer:this.getMainDomContainer();this.mainElementContainer=new GroupElementContainer(this,mainDomContainer,this.isRoot,false);this.elementContainers=[this.mainElementContainer];}','this.rendered=true;},toggleExpanded:function(){this.expanded=!this.expanded;for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].toggleExpanded();}},expand:function(){if(!this.expanded){this.toggleExpanded();}},accept:function(visitor){visitor.visitGroup(this);},reverseChildren:function(){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].reverseChildren();}}},update:function(){var previouslyExpandable=this.expandable;this.expandable=(this.children.length!==0);if(this.expandable!==previouslyExpandable){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].update();}}},flatten:function(){var visitor=new GroupFlattener();this.accept(visitor);return visitor.logEntriesAndSeparators;},removeChild:function(child,doUpdate){array_remove(this.children,child);child.group=null;if(doUpdate){this.update();}},remove:function(doUpdate,removeFromGroup){for(var i=0,len=this.children.length;i<len;i++){this.children[i].remove(false,false);}','this.children=[];this.update();if(this===currentGroup){currentGroup=this.group;}','this.doRemove(doUpdate,removeFromGroup);},serialize:function(items){items.push([LogItem.serializedItemKeys.GROUP_START,this.name]);for(var i=0,len=this.children.length;i<len;i++){this.children[i].serialize(items);}','if(this!==currentGroup){items.push([LogItem.serializedItemKeys.GROUP_END]);}},clear:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clear();}}});function LogEntryElementContainer(){}','LogEntryElementContainer.prototype=new LogItemContainerElement();copyProperties(LogEntryElementContainer.prototype,{remove:function(){this.doRemove();},doRemove:function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;this.contentElement=null;this.containerDomNode=null;},setContent:function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=content;}},setSearchMatch:function(isMatch){var oldCssClass=isMatch?"searchnonmatch":"searchmatch";var newCssClass=isMatch?"searchmatch":"searchnonmatch";replaceClass(this.mainDiv,newCssClass,oldCssClass);},clearSearch:function(){removeClass(this.mainDiv,"searchmatch");removeClass(this.mainDiv,"searchnonmatch");}});function LogEntryWrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.mainDiv.className="logentry wrapped "+this.logEntry.level;this.contentElement=this.mainDiv;}','LogEntryWrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryWrappedElementContainer.prototype.setContent=function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=wrappedContent;}};function LogEntryUnwrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry unwrapped "+this.logEntry.level;this.pre=this.mainDiv.appendChild(document.createElement("pre"));this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.pre.className="unwrapped";this.contentElement=this.pre;}','LogEntryUnwrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryUnwrappedElementContainer.prototype.remove=function(){this.doRemove();this.pre=null;};function LogEntryMainElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry nonielogentry "+this.logEntry.level;this.contentElement=this.mainDiv.appendChild(document.createElement("span"));this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));}','LogEntryMainElementContainer.prototype=new LogEntryElementContainer();function LogEntry(level,formattedMessage){this.level=level;this.formattedMessage=formattedMessage;this.rendered=false;}','LogEntry.prototype=new LogItem();copyProperties(LogEntry.prototype,{render:function(){var logEntry=this;var containerDomNode=this.group.contentDiv;if(isIe){this.formattedMessage=this.formattedMessage.replace(/\\r\\n/g,"\\r");this.unwrappedElementContainer=new LogEntryUnwrappedElementContainer(this,this.getUnwrappedDomContainer());this.wrappedElementContainer=new LogEntryWrappedElementContainer(this,this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new LogEntryMainElementContainer(this,this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}','this.content=this.formattedMessage;this.rendered=true;},setContent:function(content,wrappedContent){if(content!=this.content){if(isIe&&(content!==this.formattedMessage)){content=content.replace(/\\r\\n/g,"\\r");}','for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setContent(content,wrappedContent);}','this.content=content;}},getSearchMatches:function(){var matches=[];var i,len;if(isIe){var unwrappedEls=getElementsByClass(this.unwrappedElementContainer.mainDiv,"searchterm","span");var wrappedEls=getElementsByClass(this.wrappedElementContainer.mainDiv,"searchterm","span");for(i=0,len=unwrappedEls.length;i<len;i++){matches[i]=new Match(this.level,null,unwrappedEls[i],wrappedEls[i]);}}else{var els=getElementsByClass(this.mainElementContainer.mainDiv,"searchterm","span");for(i=0,len=els.length;i<len;i++){matches[i]=new Match(this.level,els[i]);}}','return matches;},setSearchMatch:function(isMatch){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setSearchMatch(isMatch);}},clearSearch:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clearSearch();}},accept:function(visitor){visitor.visitLogEntry(this);},serialize:function(items){items.push([LogItem.serializedItemKeys.LOG_ENTRY,this.level,this.formattedMessage]);}});function LogItemVisitor(){}','LogItemVisitor.prototype={visit:function(logItem){},visitParent:function(logItem){if(logItem.group){logItem.group.accept(this);}},visitChildren:function(logItem){for(var i=0,len=logItem.children.length;i<len;i++){logItem.children[i].accept(this);}},visitLogEntry:function(logEntry){this.visit(logEntry);},visitSeparator:function(separator){this.visit(separator);},visitGroup:function(group){this.visit(group);}};function GroupFlattener(){this.logEntriesAndSeparators=[];}','GroupFlattener.prototype=new LogItemVisitor();GroupFlattener.prototype.visitGroup=function(group){this.visitChildren(group);};GroupFlattener.prototype.visitLogEntry=function(logEntry){this.logEntriesAndSeparators.push(logEntry);};GroupFlattener.prototype.visitSeparator=function(separator){this.logEntriesAndSeparators.push(separator);};window.onload=function(){if(location.search){var queryBits=unescape(location.search).substr(1).split("&"),nameValueBits;for(var i=0,len=queryBits.length;i<len;i++){nameValueBits=queryBits[i].split("=");if(nameValueBits[0]=="log4javascript_domain"){document.domain=nameValueBits[1];break;}}}','logMainContainer=$("log");if(isIePre7){addClass(logMainContainer,"oldIe");}','rootGroup=new Group("root",true);rootGroup.render();currentGroup=rootGroup;setCommandInputWidth();setLogContainerHeight();toggleLoggingEnabled();toggleSearchEnabled();toggleSearchFilter();toggleSearchHighlight();applyFilters();checkAllLevels();toggleWrap();toggleNewestAtTop();toggleScrollToLatest();renderQueuedLogItems();loaded=true;$("command").value="";$("command").autocomplete="off";$("command").onkeydown=function(evt){evt=getEvent(evt);if(evt.keyCode==10||evt.keyCode==13){evalCommandLine();stopPropagation(evt);}else if(evt.keyCode==27){this.value="";this.focus();}else if(evt.keyCode==38&&commandHistory.length>0){currentCommandIndex=Math.max(0,currentCommandIndex-1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}else if(evt.keyCode==40&&commandHistory.length>0){currentCommandIndex=Math.min(commandHistory.length-1,currentCommandIndex+1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}};$("command").onkeypress=function(evt){evt=getEvent(evt);if(evt.keyCode==38&&commandHistory.length>0&&evt.preventDefault){evt.preventDefault();}};$("command").onkeyup=function(evt){evt=getEvent(evt);if(evt.keyCode==27&&evt.preventDefault){evt.preventDefault();this.focus();}};document.onkeydown=function keyEventHandler(evt){evt=getEvent(evt);switch(evt.keyCode){case 69:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){evalLastCommand();cancelKeyEvent(evt);return false;}','break;case 75:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusSearch();cancelKeyEvent(evt);return false;}','break;case 40:case 76:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusCommandLine();cancelKeyEvent(evt);return false;}','break;}};setTimeout(setLogContainerHeight,20);setShowCommandLine(showCommandLine);doSearch();};window.onunload=function(){if(mainWindowExists()){appender.unload();}','appender=null;};function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}','function setLoggingEnabled(enable){loggingEnabled=enable;}','var appender=null;function setAppender(appenderParam){appender=appenderParam;}','function setShowCloseButton(showCloseButton){$("closeButton").style.display=showCloseButton?"inline":"none";}','function setShowHideButton(showHideButton){$("hideButton").style.display=showHideButton?"inline":"none";}','var newestAtTop=false;function LogItemContentReverser(){}','LogItemContentReverser.prototype=new LogItemVisitor();LogItemContentReverser.prototype.visitGroup=function(group){group.reverseChildren();this.visitChildren(group);};function setNewestAtTop(isNewestAtTop){var oldNewestAtTop=newestAtTop;var i,iLen,j,jLen;newestAtTop=Boolean(isNewestAtTop);if(oldNewestAtTop!=newestAtTop){var visitor=new LogItemContentReverser();rootGroup.accept(visitor);if(currentSearch){var currentMatch=currentSearch.matches[currentMatchIndex];var matchIndex=0;var matches=[];var actOnLogEntry=function(logEntry){var logEntryMatches=logEntry.getSearchMatches();for(j=0,jLen=logEntryMatches.length;j<jLen;j++){matches[matchIndex]=logEntryMatches[j];if(currentMatch&&logEntryMatches[j].equals(currentMatch)){currentMatchIndex=matchIndex;}','matchIndex++;}};if(newestAtTop){for(i=logEntries.length-1;i>=0;i--){actOnLogEntry(logEntries[i]);}}else{for(i=0,iLen=logEntries.length;i<iLen;i++){actOnLogEntry(logEntries[i]);}}','currentSearch.matches=matches;if(currentMatch){currentMatch.setCurrent();}}else if(scrollToLatest){doScrollToLatest();}}','$("newestAtTop").checked=isNewestAtTop;}','function toggleNewestAtTop(){var isNewestAtTop=$("newestAtTop").checked;setNewestAtTop(isNewestAtTop);}','var scrollToLatest=true;function setScrollToLatest(isScrollToLatest){scrollToLatest=isScrollToLatest;if(scrollToLatest){doScrollToLatest();}','$("scrollToLatest").checked=isScrollToLatest;}','function toggleScrollToLatest(){var isScrollToLatest=$("scrollToLatest").checked;setScrollToLatest(isScrollToLatest);}','function doScrollToLatest(){var l=logMainContainer;if(typeof l.scrollTop!="undefined"){if(newestAtTop){l.scrollTop=0;}else{var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}}','var closeIfOpenerCloses=true;function setCloseIfOpenerCloses(isCloseIfOpenerCloses){closeIfOpenerCloses=isCloseIfOpenerCloses;}','var maxMessages=null;function setMaxMessages(max){maxMessages=max;pruneLogEntries();}','var showCommandLine=false;function setShowCommandLine(isShowCommandLine){showCommandLine=isShowCommandLine;if(loaded){$("commandLine").style.display=showCommandLine?"block":"none";setCommandInputWidth();setLogContainerHeight();}}','function focusCommandLine(){if(loaded){$("command").focus();}}','function focusSearch(){if(loaded){$("searchBox").focus();}}','function getLogItems(){var items=[];for(var i=0,len=logItems.length;i<len;i++){logItems[i].serialize(items);}','return items;}','function setLogItems(items){var loggingReallyEnabled=loggingEnabled;loggingEnabled=true;for(var i=0,len=items.length;i<len;i++){switch(items[i][0]){case LogItem.serializedItemKeys.LOG_ENTRY:log(items[i][1],items[i][2]);break;case LogItem.serializedItemKeys.GROUP_START:group(items[i][1]);break;case LogItem.serializedItemKeys.GROUP_END:groupEnd();break;}}','loggingEnabled=loggingReallyEnabled;}','function log(logLevel,formattedMessage){if(loggingEnabled){var logEntry=new LogEntry(logLevel,formattedMessage);logEntries.push(logEntry);logEntriesAndSeparators.push(logEntry);logItems.push(logEntry);currentGroup.addChild(logEntry);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}','logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}','function renderQueuedLogItems(){logQueuedEventsTimer=null;var pruned=pruneLogEntries();var initiallyHasMatches=currentSearch?currentSearch.hasMatches():false;for(var i=0,len=logItems.length;i<len;i++){if(!logItems[i].rendered){logItems[i].render();logItems[i].appendToLog();if(currentSearch&&(logItems[i]instanceof LogEntry)){currentSearch.applyTo(logItems[i]);}}}','if(currentSearch){if(pruned){if(currentSearch.hasVisibleMatches()){if(currentMatchIndex===null){setCurrentMatchIndex(0);}','displayMatches();}else{displayNoMatches();}}else if(!initiallyHasMatches&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}}','if(scrollToLatest){doScrollToLatest();}','unrenderedLogItemsExist=false;}','function pruneLogEntries(){if((maxMessages!==null)&&(logEntriesAndSeparators.length>maxMessages)){var numberToDelete=logEntriesAndSeparators.length-maxMessages;var prunedLogEntries=logEntriesAndSeparators.slice(0,numberToDelete);if(currentSearch){currentSearch.removeMatches(prunedLogEntries);}','var group;for(var i=0;i<numberToDelete;i++){group=logEntriesAndSeparators[i].group;array_remove(logItems,logEntriesAndSeparators[i]);array_remove(logEntries,logEntriesAndSeparators[i]);logEntriesAndSeparators[i].remove(true,true);if(group.children.length===0&&group!==currentGroup&&group!==rootGroup){array_remove(logItems,group);group.remove(true,true);}}','logEntriesAndSeparators=array_removeFromStart(logEntriesAndSeparators,numberToDelete);return true;}','return false;}','function group(name,startExpanded){if(loggingEnabled){initiallyExpanded=(typeof startExpanded==="undefined")?true:Boolean(startExpanded);var newGroup=new Group(name,false,initiallyExpanded);currentGroup.addChild(newGroup);currentGroup=newGroup;logItems.push(newGroup);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}','logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}','function groupEnd(){currentGroup=(currentGroup===rootGroup)?rootGroup:currentGroup.group;}','function mainPageReloaded(){currentGroup=rootGroup;var separator=new Separator();logEntriesAndSeparators.push(separator);logItems.push(separator);currentGroup.addChild(separator);}','function closeWindow(){if(appender&&mainWindowExists()){appender.close(true);}else{window.close();}}','function hide(){if(appender&&mainWindowExists()){appender.hide();}}','var mainWindow=window;var windowId="log4javascriptConsoleWindow_"+new Date().getTime()+"_"+(""+Math.random()).substr(2);function setMainWindow(win){mainWindow=win;mainWindow[windowId]=window;if(opener&&closeIfOpenerCloses){pollOpener();}}','function pollOpener(){if(closeIfOpenerCloses){if(mainWindowExists()){setTimeout(pollOpener,500);}else{closeWindow();}}}','function mainWindowExists(){try{return(mainWindow&&!mainWindow.closed&&mainWindow[windowId]==window);}catch(ex){}','return false;}','var logLevels=["TRACE","DEBUG","INFO","WARN","ERROR","FATAL"];function getCheckBox(logLevel){return $("switch_"+logLevel);}','function getIeWrappedLogContainer(){return $("log_wrapped");}','function getIeUnwrappedLogContainer(){return $("log_unwrapped");}','function applyFilters(){for(var i=0;i<logLevels.length;i++){if(getCheckBox(logLevels[i]).checked){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}','updateSearchFromFilters();}','function toggleAllLevels(){var turnOn=$("switch_ALL").checked;for(var i=0;i<logLevels.length;i++){getCheckBox(logLevels[i]).checked=turnOn;if(turnOn){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}}','function checkAllLevels(){for(var i=0;i<logLevels.length;i++){if(!getCheckBox(logLevels[i]).checked){getCheckBox("ALL").checked=false;return;}}','getCheckBox("ALL").checked=true;}','function clearLog(){rootGroup.clear();currentGroup=rootGroup;logEntries=[];logItems=[];logEntriesAndSeparators=[];doSearch();}','function toggleWrap(){var enable=$("wrap").checked;if(enable){addClass(logMainContainer,"wrap");}else{removeClass(logMainContainer,"wrap");}','refreshCurrentMatch();}','var searchTimer=null;function scheduleSearch(){try{clearTimeout(searchTimer);}catch(ex){}','searchTimer=setTimeout(doSearch,500);}','function Search(searchTerm,isRegex,searchRegex,isCaseSensitive){this.searchTerm=searchTerm;this.isRegex=isRegex;this.searchRegex=searchRegex;this.isCaseSensitive=isCaseSensitive;this.matches=[];}','Search.prototype={hasMatches:function(){return this.matches.length>0;},hasVisibleMatches:function(){if(this.hasMatches()){for(var i=0;i<this.matches.length;i++){if(this.matches[i].isVisible()){return true;}}}','return false;},match:function(logEntry){var entryText=String(logEntry.formattedMessage);var matchesSearch=false;if(this.isRegex){matchesSearch=this.searchRegex.test(entryText);}else if(this.isCaseSensitive){matchesSearch=(entryText.indexOf(this.searchTerm)>-1);}else{matchesSearch=(entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase())>-1);}','return matchesSearch;},getNextVisibleMatchIndex:function(){for(var i=currentMatchIndex+1;i<this.matches.length;i++){if(this.matches[i].isVisible()){return i;}}','for(i=0;i<=currentMatchIndex;i++){if(this.matches[i].isVisible()){return i;}}','return-1;},getPreviousVisibleMatchIndex:function(){for(var i=currentMatchIndex-1;i>=0;i--){if(this.matches[i].isVisible()){return i;}}','for(var i=this.matches.length-1;i>=currentMatchIndex;i--){if(this.matches[i].isVisible()){return i;}}','return-1;},applyTo:function(logEntry){var doesMatch=this.match(logEntry);if(doesMatch){logEntry.group.expand();logEntry.setSearchMatch(true);var logEntryContent;var wrappedLogEntryContent;var searchTermReplacementStartTag="<span class=\\\"searchterm\\\">";var searchTermReplacementEndTag="<"+"/span>";var preTagName=isIe?"pre":"span";var preStartTag="<"+preTagName+" class=\\\"pre\\\">";var preEndTag="<"+"/"+preTagName+">";var startIndex=0;var searchIndex,matchedText,textBeforeMatch;if(this.isRegex){var flags=this.isCaseSensitive?"g":"gi";var capturingRegex=new RegExp("("+this.searchRegex.source+")",flags);var rnd=(""+Math.random()).substr(2);var startToken="%%s"+rnd+"%%";var endToken="%%e"+rnd+"%%";logEntryContent=logEntry.formattedMessage.replace(capturingRegex,startToken+"$1"+endToken);logEntryContent=escapeHtml(logEntryContent);var result;var searchString=logEntryContent;logEntryContent="";wrappedLogEntryContent="";while((searchIndex=searchString.indexOf(startToken,startIndex))>-1){var endTokenIndex=searchString.indexOf(endToken,searchIndex);matchedText=searchString.substring(searchIndex+startToken.length,endTokenIndex);textBeforeMatch=searchString.substring(startIndex,searchIndex);logEntryContent+=preStartTag+textBeforeMatch+preEndTag;logEntryContent+=searchTermReplacementStartTag+preStartTag+matchedText+','preEndTag+searchTermReplacementEndTag;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+','matchedText+searchTermReplacementEndTag;}','startIndex=endTokenIndex+endToken.length;}','logEntryContent+=preStartTag+searchString.substr(startIndex)+preEndTag;if(isIe){wrappedLogEntryContent+=searchString.substr(startIndex);}}else{logEntryContent="";wrappedLogEntryContent="";var searchTermReplacementLength=searchTermReplacementStartTag.length+','this.searchTerm.length+searchTermReplacementEndTag.length;var searchTermLength=this.searchTerm.length;var searchTermLowerCase=this.searchTerm.toLowerCase();var logTextLowerCase=logEntry.formattedMessage.toLowerCase();while((searchIndex=logTextLowerCase.indexOf(searchTermLowerCase,startIndex))>-1){matchedText=escapeHtml(logEntry.formattedMessage.substr(searchIndex,this.searchTerm.length));textBeforeMatch=escapeHtml(logEntry.formattedMessage.substring(startIndex,searchIndex));var searchTermReplacement=searchTermReplacementStartTag+','preStartTag+matchedText+preEndTag+searchTermReplacementEndTag;logEntryContent+=preStartTag+textBeforeMatch+preEndTag+searchTermReplacement;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+','matchedText+searchTermReplacementEndTag;}','startIndex=searchIndex+searchTermLength;}','var textAfterLastMatch=escapeHtml(logEntry.formattedMessage.substr(startIndex));logEntryContent+=preStartTag+textAfterLastMatch+preEndTag;if(isIe){wrappedLogEntryContent+=textAfterLastMatch;}}','logEntry.setContent(logEntryContent,wrappedLogEntryContent);var logEntryMatches=logEntry.getSearchMatches();this.matches=this.matches.concat(logEntryMatches);}else{logEntry.setSearchMatch(false);logEntry.setContent(logEntry.formattedMessage,logEntry.formattedMessage);}','return doesMatch;},removeMatches:function(logEntries){var matchesToRemoveCount=0;var currentMatchRemoved=false;var matchesToRemove=[];var i,iLen,j,jLen;for(i=0,iLen=this.matches.length;i<iLen;i++){for(j=0,jLen=logEntries.length;j<jLen;j++){if(this.matches[i].belongsTo(logEntries[j])){matchesToRemove.push(this.matches[i]);if(i===currentMatchIndex){currentMatchRemoved=true;}}}}','var newMatch=currentMatchRemoved?null:this.matches[currentMatchIndex];if(currentMatchRemoved){for(i=currentMatchIndex,iLen=this.matches.length;i<iLen;i++){if(this.matches[i].isVisible()&&!array_contains(matchesToRemove,this.matches[i])){newMatch=this.matches[i];break;}}}','for(i=0,iLen=matchesToRemove.length;i<iLen;i++){array_remove(this.matches,matchesToRemove[i]);matchesToRemove[i].remove();}','if(this.hasVisibleMatches()){if(newMatch===null){setCurrentMatchIndex(0);}else{var newMatchIndex=0;for(i=0,iLen=this.matches.length;i<iLen;i++){if(newMatch===this.matches[i]){newMatchIndex=i;break;}}','setCurrentMatchIndex(newMatchIndex);}}else{currentMatchIndex=null;displayNoMatches();}}};function getPageOffsetTop(el,container){var currentEl=el;var y=0;while(currentEl&&currentEl!=container){y+=currentEl.offsetTop;currentEl=currentEl.offsetParent;}','return y;}','function scrollIntoView(el){var logContainer=logMainContainer;if(!$("wrap").checked){var logContainerLeft=logContainer.scrollLeft;var logContainerRight=logContainerLeft+logContainer.offsetWidth;var elLeft=el.offsetLeft;var elRight=elLeft+el.offsetWidth;if(elLeft<logContainerLeft||elRight>logContainerRight){logContainer.scrollLeft=elLeft-(logContainer.offsetWidth-el.offsetWidth)/2;}}','var logContainerTop=logContainer.scrollTop;var logContainerBottom=logContainerTop+logContainer.offsetHeight;var elTop=getPageOffsetTop(el)-getToolBarsHeight();var elBottom=elTop+el.offsetHeight;if(elTop<logContainerTop||elBottom>logContainerBottom){logContainer.scrollTop=elTop-(logContainer.offsetHeight-el.offsetHeight)/2;}}','function Match(logEntryLevel,spanInMainDiv,spanInUnwrappedPre,spanInWrappedDiv){this.logEntryLevel=logEntryLevel;this.spanInMainDiv=spanInMainDiv;if(isIe){this.spanInUnwrappedPre=spanInUnwrappedPre;this.spanInWrappedDiv=spanInWrappedDiv;}','this.mainSpan=isIe?spanInUnwrappedPre:spanInMainDiv;}','Match.prototype={equals:function(match){return this.mainSpan===match.mainSpan;},setCurrent:function(){if(isIe){addClass(this.spanInUnwrappedPre,"currentmatch");addClass(this.spanInWrappedDiv,"currentmatch");var elementToScroll=$("wrap").checked?this.spanInWrappedDiv:this.spanInUnwrappedPre;scrollIntoView(elementToScroll);}else{addClass(this.spanInMainDiv,"currentmatch");scrollIntoView(this.spanInMainDiv);}},belongsTo:function(logEntry){if(isIe){return isDescendant(this.spanInUnwrappedPre,logEntry.unwrappedPre);}else{return isDescendant(this.spanInMainDiv,logEntry.mainDiv);}},setNotCurrent:function(){if(isIe){removeClass(this.spanInUnwrappedPre,"currentmatch");removeClass(this.spanInWrappedDiv,"currentmatch");}else{removeClass(this.spanInMainDiv,"currentmatch");}},isOrphan:function(){return isOrphan(this.mainSpan);},isVisible:function(){return getCheckBox(this.logEntryLevel).checked;},remove:function(){if(isIe){this.spanInUnwrappedPre=null;this.spanInWrappedDiv=null;}else{this.spanInMainDiv=null;}}};var currentSearch=null;var currentMatchIndex=null;function doSearch(){var searchBox=$("searchBox");var searchTerm=searchBox.value;var isRegex=$("searchRegex").checked;var isCaseSensitive=$("searchCaseSensitive").checked;var i;if(searchTerm===""){$("searchReset").disabled=true;$("searchNav").style.display="none";removeClass(document.body,"searching");removeClass(searchBox,"hasmatches");removeClass(searchBox,"nomatches");for(i=0;i<logEntries.length;i++){logEntries[i].clearSearch();logEntries[i].setContent(logEntries[i].formattedMessage,logEntries[i].formattedMessage);}','currentSearch=null;setLogContainerHeight();}else{$("searchReset").disabled=false;$("searchNav").style.display="block";var searchRegex;var regexValid;if(isRegex){try{searchRegex=isCaseSensitive?new RegExp(searchTerm,"g"):new RegExp(searchTerm,"gi");regexValid=true;replaceClass(searchBox,"validregex","invalidregex");searchBox.title="Valid regex";}catch(ex){regexValid=false;replaceClass(searchBox,"invalidregex","validregex");searchBox.title="Invalid regex: "+(ex.message?ex.message:(ex.description?ex.description:"unknown error"));return;}}else{searchBox.title="";removeClass(searchBox,"validregex");removeClass(searchBox,"invalidregex");}','addClass(document.body,"searching");currentSearch=new Search(searchTerm,isRegex,searchRegex,isCaseSensitive);for(i=0;i<logEntries.length;i++){currentSearch.applyTo(logEntries[i]);}','setLogContainerHeight();if(currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}else{displayNoMatches();}}}','function updateSearchFromFilters(){if(currentSearch){if(currentSearch.hasMatches()){if(currentMatchIndex===null){currentMatchIndex=0;}','var currentMatch=currentSearch.matches[currentMatchIndex];if(currentMatch.isVisible()){displayMatches();setCurrentMatchIndex(currentMatchIndex);}else{currentMatch.setNotCurrent();var nextVisibleMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextVisibleMatchIndex>-1){setCurrentMatchIndex(nextVisibleMatchIndex);displayMatches();}else{displayNoMatches();}}}else{displayNoMatches();}}}','function refreshCurrentMatch(){if(currentSearch&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(currentMatchIndex);}}','function displayMatches(){replaceClass($("searchBox"),"hasmatches","nomatches");$("searchBox").title=""+currentSearch.matches.length+" matches found";$("searchNav").style.display="block";setLogContainerHeight();}','function displayNoMatches(){replaceClass($("searchBox"),"nomatches","hasmatches");$("searchBox").title="No matches found";$("searchNav").style.display="none";setLogContainerHeight();}','function toggleSearchEnabled(enable){enable=(typeof enable=="undefined")?!$("searchDisable").checked:enable;$("searchBox").disabled=!enable;$("searchReset").disabled=!enable;$("searchRegex").disabled=!enable;$("searchNext").disabled=!enable;$("searchPrevious").disabled=!enable;$("searchCaseSensitive").disabled=!enable;$("searchNav").style.display=(enable&&($("searchBox").value!=="")&&currentSearch&&currentSearch.hasVisibleMatches())?"block":"none";if(enable){removeClass($("search"),"greyedout");addClass(document.body,"searching");if($("searchHighlight").checked){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}','if($("searchFilter").checked){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}','$("searchDisable").checked=!enable;}else{addClass($("search"),"greyedout");removeClass(document.body,"searching");removeClass(logMainContainer,"searchhighlight");removeClass(logMainContainer,"searchfilter");}','setLogContainerHeight();}','function toggleSearchFilter(){var enable=$("searchFilter").checked;if(enable){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}','refreshCurrentMatch();}','function toggleSearchHighlight(){var enable=$("searchHighlight").checked;if(enable){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}}','function clearSearch(){$("searchBox").value="";doSearch();}','function searchNext(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var nextMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextMatchIndex>currentMatchIndex||confirm("Reached the end of the page. Start from the top?")){setCurrentMatchIndex(nextMatchIndex);}}}','function searchPrevious(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var previousMatchIndex=currentSearch.getPreviousVisibleMatchIndex();if(previousMatchIndex<currentMatchIndex||confirm("Reached the start of the page. Continue from the bottom?")){setCurrentMatchIndex(previousMatchIndex);}}}','function setCurrentMatchIndex(index){currentMatchIndex=index;currentSearch.matches[currentMatchIndex].setCurrent();}','function addClass(el,cssClass){if(!hasClass(el,cssClass)){if(el.className){el.className+=" "+cssClass;}else{el.className=cssClass;}}}','function hasClass(el,cssClass){if(el.className){var classNames=el.className.split(" ");return array_contains(classNames,cssClass);}','return false;}','function removeClass(el,cssClass){if(hasClass(el,cssClass)){var existingClasses=el.className.split(" ");var newClasses=[];for(var i=0,len=existingClasses.length;i<len;i++){if(existingClasses[i]!=cssClass){newClasses[newClasses.length]=existingClasses[i];}}','el.className=newClasses.join(" ");}}','function replaceClass(el,newCssClass,oldCssClass){removeClass(el,oldCssClass);addClass(el,newCssClass);}','function getElementsByClass(el,cssClass,tagName){var elements=el.getElementsByTagName(tagName);var matches=[];for(var i=0,len=elements.length;i<len;i++){if(hasClass(elements[i],cssClass)){matches.push(elements[i]);}}','return matches;}','function $(id){return document.getElementById(id);}','function isDescendant(node,ancestorNode){while(node!=null){if(node===ancestorNode){return true;}','node=node.parentNode;}','return false;}','function isOrphan(node){var currentNode=node;while(currentNode){if(currentNode==document.body){return false;}','currentNode=currentNode.parentNode;}','return true;}','function escapeHtml(str){return str.replace(/&/g,"&amp;").replace(/[<]/g,"&lt;").replace(/>/g,"&gt;");}','function getWindowWidth(){if(window.innerWidth){return window.innerWidth;}else if(document.documentElement&&document.documentElement.clientWidth){return document.documentElement.clientWidth;}else if(document.body){return document.body.clientWidth;}','return 0;}','function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}','return 0;}','function getToolBarsHeight(){return $("switches").offsetHeight;}','function getChromeHeight(){var height=getToolBarsHeight();if(showCommandLine){height+=$("commandLine").offsetHeight;}','return height;}','function setLogContainerHeight(){if(logMainContainer){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";logMainContainer.style.height=""+','Math.max(0,windowHeight-getChromeHeight())+"px";}}','function setCommandInputWidth(){if(showCommandLine){$("command").style.width=""+Math.max(0,$("commandLineContainer").offsetWidth-','($("evaluateButton").offsetWidth+13))+"px";}}','window.onresize=function(){setCommandInputWidth();setLogContainerHeight();};if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}','return this.length;};}','if(!Array.prototype.pop){Array.prototype.pop=function(){if(this.length>0){var val=this[this.length-1];this.length=this.length-1;return val;}};}','if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}','this.length=this.length-1;return firstItem;}};}','if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}','var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}','return itemsDeleted;};}','function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}','if(index>=0){arr.splice(index,1);return index;}else{return false;}}','function array_removeFromStart(array,numberToRemove){if(Array.prototype.splice){array.splice(0,numberToRemove);}else{for(var i=numberToRemove,len=array.length;i<len;i++){array[i-numberToRemove]=array[i];}','array.length=array.length-numberToRemove;}','return array;}','function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}','return false;}','function getErrorMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}','return""+ex;}','function moveCaretToEnd(input){if(input.setSelectionRange){input.focus();var length=input.value.length;input.setSelectionRange(length,length);}else if(input.createTextRange){var range=input.createTextRange();range.collapse(false);range.select();}','input.focus();}','function stopPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}}','function getEvent(evt){return evt?evt:event;}','function getTarget(evt){return evt.target?evt.target:evt.srcElement;}','function getRelatedTarget(evt){if(evt.relatedTarget){return evt.relatedTarget;}else if(evt.srcElement){switch(evt.type){case"mouseover":return evt.fromElement;case"mouseout":return evt.toElement;default:return evt.srcElement;}}}','function cancelKeyEvent(evt){evt.returnValue=false;stopPropagation(evt);}','function evalCommandLine(){var expr=$("command").value;evalCommand(expr);$("command").value="";}','function evalLastCommand(){if(lastCommand!=null){evalCommand(lastCommand);}}','var lastCommand=null;var commandHistory=[];var currentCommandIndex=0;function evalCommand(expr){if(appender){appender.evalCommandAndAppend(expr);}else{var prefix=">>> "+expr+"\\r\\n";try{log("INFO",prefix+eval(expr));}catch(ex){log("ERROR",prefix+"Error: "+getErrorMessage(ex));}}','if(expr!=commandHistory[commandHistory.length-1]){commandHistory.push(expr);if(appender){appender.storeCommandHistory(commandHistory);}}','currentCommandIndex=(expr==commandHistory[currentCommandIndex])?currentCommandIndex+1:commandHistory.length;lastCommand=expr;}','//]]>','</script>','<style type="text/css">','body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#switchesContainer input{margin-bottom:0}div.toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div.toolbar,div#search input{font-family:tahoma,verdana,arial,helvetica,sans-serif}div.toolbar input.button{padding:0 5px;font-size:100%}div.toolbar input.hidden{display:none}div#switches input#clearButton{margin-left:20px}div#levels label{font-weight:bold}div#levels label,div#options label{margin-right:5px}div#levels label#wrapLabel{font-weight:normal}div#search label{margin-right:10px}div#search label.searchboxlabel{margin-right:0}div#search input{font-size:100%}div#search input.validregex{color:green}div#search input.invalidregex{color:red}div#search input.nomatches{color:white;background-color:#ff6666}div#search input.nomatches{color:white;background-color:#ff6666}div#searchNav{display:none}div#commandLine{display:none}div#commandLine input#command{font-size:100%;font-family:Courier New,Courier}div#commandLine input#evaluateButton{}*.greyedout{color:gray !important;border-color:gray !important}*.greyedout *.alwaysenabled{color:black}*.unselectable{-khtml-user-select:none;-moz-user-select:none;user-select:none}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both;position:relative}div.group{border-color:#cccccc;border-style:solid;border-width:1px 0 1px 1px;overflow:visible}div.oldIe div.group,div.oldIe div.group *,div.oldIe *.logentry{height:1%}div.group div.groupheading span.expander{border:solid black 1px;font-family:Courier New,Courier;font-size:0.833em;background-color:#eeeeee;position:relative;top:-1px;color:black;padding:0 2px;cursor:pointer;cursor:hand;height:1%}div.group div.groupcontent{margin-left:10px;padding-bottom:2px;overflow:visible}div.group div.expanded{display:block}div.group div.collapsed{display:none}*.logentry{overflow:visible;display:none;white-space:pre}span.pre{white-space:pre}pre.unwrapped{display:inline !important}pre.unwrapped pre.pre,div.wrapped pre.pre{display:inline}div.wrapped pre.pre{white-space:normal}div.wrapped{display:none}body.searching *.logentry span.currentmatch{color:white !important;background-color:green !important}body.searching div.searchhighlight *.logentry span.searchterm{color:black;background-color:yellow}div.wrap *.logentry{white-space:normal !important;border-width:0 0 1px 0;border-color:#dddddd;border-style:dotted}div.wrap #log_wrapped,#log_unwrapped{display:block}div.wrap #log_unwrapped,#log_wrapped{display:none}div.wrap *.logentry span.pre{overflow:visible;white-space:normal}div.wrap *.logentry pre.unwrapped{display:none}div.wrap *.logentry span.wrapped{display:inline}div.searchfilter *.searchnonmatch{display:none !important}div#log *.TRACE,label#label_TRACE{color:#666666}div#log *.DEBUG,label#label_DEBUG{color:green}div#log *.INFO,label#label_INFO{color:#000099}div#log *.WARN,label#label_WARN{color:#999900}div#log *.ERROR,label#label_ERROR{color:red}div#log *.FATAL,label#label_FATAL{color:#660066}div.TRACE#log *.TRACE,div.DEBUG#log *.DEBUG,div.INFO#log *.INFO,div.WARN#log *.WARN,div.ERROR#log *.ERROR,div.FATAL#log *.FATAL{display:block}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}','</style>','</head>','<body id="body">','<div id="switchesContainer">','<div id="switches">','<div id="levels" class="toolbar">','Filters:','<input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>','<input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>','<input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>','<input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>','<input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>','<input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>','<input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>','</div>','<div id="search" class="toolbar">','<label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />','<input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />','<input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>','<input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>','<input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>','<div id="searchNav">','<input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />','<input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />','<input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>','<input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>','</div>','</div>','<div id="options" class="toolbar">','Options:','<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>','<input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>','<input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>','<input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>','<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />','<input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />','<input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />','</div>','</div>','</div>','<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>','<div id="commandLine" class="toolbar">','<div id="commandLineContainer">','<input type="text" id="command" title="Enter a JavaScript command here and hit return or press \'Evaluate\'" />','<input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />','</div>','</div>','</body>','</html>',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;var showLogEntryDeleteButtons=this.defaults.showLogEntryDeleteButtons;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}\r
+return true;};var consoleWindowExists=function(){return(consoleWindowLoaded&&isSupported&&!consoleClosed);};this.isNewestMessageAtTop=function(){return newestMessageAtTop;};this.setNewestMessageAtTop=function(newestMessageAtTopParam){newestMessageAtTop=bool(newestMessageAtTopParam);if(consoleWindowExists()){getConsoleWindow().setNewestAtTop(newestMessageAtTop);}};this.isScrollToLatestMessage=function(){return scrollToLatestMessage;};this.setScrollToLatestMessage=function(scrollToLatestMessageParam){scrollToLatestMessage=bool(scrollToLatestMessageParam);if(consoleWindowExists()){getConsoleWindow().setScrollToLatest(scrollToLatestMessage);}};this.getWidth=function(){return width;};this.setWidth=function(widthParam){if(checkCanConfigure("width")){width=extractStringFromParam(widthParam,width);}};this.getHeight=function(){return height;};this.setHeight=function(heightParam){if(checkCanConfigure("height")){height=extractStringFromParam(heightParam,height);}};this.getMaxMessages=function(){return maxMessages;};this.setMaxMessages=function(maxMessagesParam){maxMessages=extractIntFromParam(maxMessagesParam,maxMessages);if(consoleWindowExists()){getConsoleWindow().setMaxMessages(maxMessages);}};this.isShowCommandLine=function(){return showCommandLine;};this.setShowCommandLine=function(showCommandLineParam){showCommandLine=bool(showCommandLineParam);if(consoleWindowExists()){getConsoleWindow().setShowCommandLine(showCommandLine);}};this.isShowHideButton=function(){return showHideButton;};this.setShowHideButton=function(showHideButtonParam){showHideButton=bool(showHideButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowHideButton(showHideButton);}};this.isShowCloseButton=function(){return showCloseButton;};this.setShowCloseButton=function(showCloseButtonParam){showCloseButton=bool(showCloseButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowCloseButton(showCloseButton);}};this.getCommandLineObjectExpansionDepth=function(){return commandLineObjectExpansionDepth;};this.setCommandLineObjectExpansionDepth=function(commandLineObjectExpansionDepthParam){commandLineObjectExpansionDepth=extractIntFromParam(commandLineObjectExpansionDepthParam,commandLineObjectExpansionDepth);};var minimized=initiallyMinimized;this.isInitiallyMinimized=function(){return initiallyMinimized;};this.setInitiallyMinimized=function(initiallyMinimizedParam){if(checkCanConfigure("initiallyMinimized")){initiallyMinimized=bool(initiallyMinimizedParam);minimized=initiallyMinimized;}};this.isUseDocumentWrite=function(){return useDocumentWrite;};this.setUseDocumentWrite=function(useDocumentWriteParam){if(checkCanConfigure("useDocumentWrite")){useDocumentWrite=bool(useDocumentWriteParam);}};function QueuedLoggingEvent(loggingEvent,formattedMessage){this.loggingEvent=loggingEvent;this.levelName=loggingEvent.level.name;this.formattedMessage=formattedMessage;}\r
+QueuedLoggingEvent.prototype.append=function(){getConsoleWindow().log(this.levelName,this.formattedMessage);};function QueuedGroup(name,initiallyExpanded){this.name=name;this.initiallyExpanded=initiallyExpanded;}\r
+QueuedGroup.prototype.append=function(){getConsoleWindow().group(this.name,this.initiallyExpanded);};function QueuedGroupEnd(){}\r
+QueuedGroupEnd.prototype.append=function(){getConsoleWindow().groupEnd();};var checkAndAppend=function(){safeToAppend();if(!initialized){init();}else if(consoleClosed&&reopenWhenClosed){createWindow();}\r
+if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){var currentLoggingEvent;while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}\r
+if(focusConsoleWindow){getConsoleWindow().focus();}};this.setAddedToLogger=function(logger){this.loggers.push(logger);if(enabled&&!lazyInit){init();}};this.clear=function(){if(consoleWindowExists()){getConsoleWindow().clearLog();}\r
+queuedLoggingEvents.length=0;};this.focus=function(){if(consoleWindowExists()){getConsoleWindow().focus();}};this.focusCommandLine=function(){if(consoleWindowExists()){getConsoleWindow().focusCommandLine();}};this.focusSearch=function(){if(consoleWindowExists()){getConsoleWindow().focusSearch();}};var commandWindow=window;this.getCommandWindow=function(){return commandWindow;};this.setCommandWindow=function(commandWindowParam){commandWindow=commandWindowParam;};this.executeLastCommand=function(){if(consoleWindowExists()){getConsoleWindow().evalLastCommand();}};var commandLayout=new PatternLayout("%m");this.getCommandLayout=function(){return commandLayout;};this.setCommandLayout=function(commandLayoutParam){commandLayout=commandLayoutParam;};this.evalCommandAndAppend=function(expr){var commandReturnValue={appendResult:true,isError:false};var commandOutput="";try{var result,i;if(!commandWindow.eval&&commandWindow.execScript){commandWindow.execScript("null");}\r
+var commandLineFunctionsHash={};for(i=0,len=commandLineFunctions.length;i<len;i++){commandLineFunctionsHash[commandLineFunctions[i][0]]=commandLineFunctions[i][1];}\r
+var objectsToRestore=[];var addObjectToRestore=function(name){objectsToRestore.push([name,commandWindow[name]]);};addObjectToRestore("appender");commandWindow.appender=appender;addObjectToRestore("commandReturnValue");commandWindow.commandReturnValue=commandReturnValue;addObjectToRestore("commandLineFunctionsHash");commandWindow.commandLineFunctionsHash=commandLineFunctionsHash;var addFunctionToWindow=function(name){addObjectToRestore(name);commandWindow[name]=function(){return this.commandLineFunctionsHash[name](appender,arguments,commandReturnValue);};};for(i=0,len=commandLineFunctions.length;i<len;i++){addFunctionToWindow(commandLineFunctions[i][0]);}\r
+if(commandWindow===window&&commandWindow.execScript){addObjectToRestore("evalExpr");addObjectToRestore("result");window.evalExpr=expr;commandWindow.execScript("window.result=eval(window.evalExpr);");result=window.result;}else{result=commandWindow.eval(expr);}\r
+commandOutput=isUndefined(result)?result:formatObjectExpansion(result,commandLineObjectExpansionDepth);for(i=0,len=objectsToRestore.length;i<len;i++){commandWindow[objectsToRestore[i][0]]=objectsToRestore[i][1];}}catch(ex){commandOutput="Error evaluating command: "+getExceptionStringRep(ex);commandReturnValue.isError=true;}\r
+if(commandReturnValue.appendResult){var message=">>> "+expr;if(!isUndefined(commandOutput)){message+=newLine+commandOutput;}\r
+var level=commandReturnValue.isError?Level.ERROR:Level.INFO;var loggingEvent=new LoggingEvent(null,new Date(),level,[message],null);var mainLayout=this.getLayout();this.setLayout(commandLayout);this.append(loggingEvent);this.setLayout(mainLayout);}};var commandLineFunctions=defaultCommandLineFunctions.concat([]);this.addCommandLineFunction=function(functionName,commandLineFunction){commandLineFunctions.push([functionName,commandLineFunction]);};var commandHistoryCookieName="log4javascriptCommandHistory";this.storeCommandHistory=function(commandHistory){setCookie(commandHistoryCookieName,commandHistory.join(","));};var writeHtml=function(doc){var lines=getConsoleHtmlLines();doc.open();for(var i=0,len=lines.length;i<len;i++){doc.writeln(lines[i]);}\r
+doc.close();};this.setEventTypes(["load","unload"]);var consoleWindowLoadHandler=function(){var win=getConsoleWindow();win.setAppender(appender);win.setNewestAtTop(newestMessageAtTop);win.setScrollToLatest(scrollToLatestMessage);win.setMaxMessages(maxMessages);win.setShowCommandLine(showCommandLine);win.setShowHideButton(showHideButton);win.setShowCloseButton(showCloseButton);win.setMainWindow(window);var storedValue=getCookie(commandHistoryCookieName);if(storedValue){win.commandHistory=storedValue.split(",");win.currentCommandIndex=win.commandHistory.length;}\r
+appender.dispatchEvent("load",{"win":win});};this.unload=function(){logLog.debug("unload "+this+", caller: "+this.unload.caller);if(!consoleClosed){logLog.debug("really doing unload "+this);consoleClosed=true;consoleWindowLoaded=false;consoleWindowCreated=false;appender.dispatchEvent("unload",{});}};var pollConsoleWindow=function(windowTest,interval,successCallback,errorMessage){function doPoll(){try{if(consoleClosed){clearInterval(poll);}\r
+if(windowTest(getConsoleWindow())){clearInterval(poll);successCallback();}}catch(ex){clearInterval(poll);isSupported=false;handleError(errorMessage,ex);}}\r
+var poll=setInterval(doPoll,interval);};var getConsoleUrl=function(){var documentDomainSet=(document.domain!=location.hostname);return useDocumentWrite?"":getBaseUrl()+"console.html"+\r
+(documentDomainSet?"?log4javascript_domain="+escape(document.domain):"");};if(inPage){var containerElement=null;var cssProperties=[];this.addCssProperty=function(name,value){if(checkCanConfigure("cssProperties")){cssProperties.push([name,value]);}};var windowCreationStarted=false;var iframeContainerDiv;var iframeId=uniqueId+"_InPageAppender_"+consoleAppenderId;this.hide=function(){if(initialized&&consoleWindowCreated){if(consoleWindowExists()){getConsoleWindow().$("command").blur();}\r
+iframeContainerDiv.style.display="none";minimized=true;}};this.show=function(){if(initialized){if(consoleWindowCreated){iframeContainerDiv.style.display="block";this.setShowCommandLine(showCommandLine);minimized=false;}else if(!windowCreationStarted){createWindow(true);}}};this.isVisible=function(){return!minimized&&!consoleClosed;};this.close=function(fromButton){if(!consoleClosed&&(!fromButton||confirm("This will permanently remove the console from the page. No more messages will be logged. Do you wish to continue?"))){iframeContainerDiv.parentNode.removeChild(iframeContainerDiv);this.unload();}};open=function(){var initErrorMessage="InPageAppender.open: unable to create console iframe";function finalInit(){try{if(!initiallyMinimized){appender.show();}\r
+consoleWindowLoadHandler();consoleWindowLoaded=true;appendQueuedLoggingEvents();}catch(ex){isSupported=false;handleError(initErrorMessage,ex);}}\r
+function writeToDocument(){try{var windowTest=function(win){return isLoaded(win);};if(useDocumentWrite){writeHtml(getConsoleWindow().document);}\r
+if(windowTest(getConsoleWindow())){finalInit();}else{pollConsoleWindow(windowTest,100,finalInit,initErrorMessage);}}catch(ex){isSupported=false;handleError(initErrorMessage,ex);}}\r
+minimized=false;iframeContainerDiv=containerElement.appendChild(document.createElement("div"));iframeContainerDiv.style.width=width;iframeContainerDiv.style.height=height;iframeContainerDiv.style.border="solid gray 1px";for(var i=0,len=cssProperties.length;i<len;i++){iframeContainerDiv.style[cssProperties[i][0]]=cssProperties[i][1];}\r
+var iframeSrc=useDocumentWrite?"":" src='"+getConsoleUrl()+"'";iframeContainerDiv.innerHTML="<iframe id='"+iframeId+"' name='"+iframeId+"' width='100%' height='100%' frameborder='0'"+iframeSrc+" scrolling='no'></iframe>";consoleClosed=false;var iframeDocumentExistsTest=function(win){try{return bool(win)&&bool(win.document);}catch(ex){return false;}};if(iframeDocumentExistsTest(getConsoleWindow())){writeToDocument();}else{pollConsoleWindow(iframeDocumentExistsTest,100,writeToDocument,initErrorMessage);}\r
+consoleWindowCreated=true;};createWindow=function(show){if(show||!initiallyMinimized){var pageLoadHandler=function(){if(!container){containerElement=document.createElement("div");containerElement.style.position="fixed";containerElement.style.left="0";containerElement.style.right="0";containerElement.style.bottom="0";document.body.appendChild(containerElement);appender.addCssProperty("borderWidth","1px 0 0 0");appender.addCssProperty("zIndex",1000000);open();}else{try{var el=document.getElementById(container);if(el.nodeType==1){containerElement=el;}\r
+open();}catch(ex){handleError("InPageAppender.init: invalid container element '"+container+"' supplied",ex);}}};if(pageLoaded&&container&&container.appendChild){containerElement=container;open();}else if(pageLoaded){pageLoadHandler();}else{log4javascript.addEventListener("load",pageLoadHandler);}\r
+windowCreationStarted=true;}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){var iframe=window.frames[iframeId];if(iframe){return iframe;}};safeToAppend=function(){if(isSupported&&!consoleClosed){if(consoleWindowCreated&&!consoleWindowLoaded&&getConsoleWindow()&&isLoaded(getConsoleWindow())){consoleWindowLoaded=true;}\r
+return consoleWindowLoaded;}\r
+return false;};}else{var useOldPopUp=appender.defaults.useOldPopUp;var complainAboutPopUpBlocking=appender.defaults.complainAboutPopUpBlocking;var reopenWhenClosed=this.defaults.reopenWhenClosed;this.isUseOldPopUp=function(){return useOldPopUp;};this.setUseOldPopUp=function(useOldPopUpParam){if(checkCanConfigure("useOldPopUp")){useOldPopUp=bool(useOldPopUpParam);}};this.isComplainAboutPopUpBlocking=function(){return complainAboutPopUpBlocking;};this.setComplainAboutPopUpBlocking=function(complainAboutPopUpBlockingParam){if(checkCanConfigure("complainAboutPopUpBlocking")){complainAboutPopUpBlocking=bool(complainAboutPopUpBlockingParam);}};this.isFocusPopUp=function(){return focusConsoleWindow;};this.setFocusPopUp=function(focusPopUpParam){focusConsoleWindow=bool(focusPopUpParam);};this.isReopenWhenClosed=function(){return reopenWhenClosed;};this.setReopenWhenClosed=function(reopenWhenClosedParam){reopenWhenClosed=bool(reopenWhenClosedParam);};this.close=function(){logLog.debug("close "+this);try{popUp.close();this.unload();}catch(ex){}};this.hide=function(){logLog.debug("hide "+this);if(consoleWindowExists()){this.close();}};this.show=function(){logLog.debug("show "+this);if(!consoleWindowCreated){open();}};this.isVisible=function(){return safeToAppend();};var popUp;open=function(){var windowProperties="width="+width+",height="+height+",status,resizable";var frameInfo="";try{var frameEl=window.frameElement;if(frameEl){frameInfo="_"+frameEl.tagName+"_"+(frameEl.name||frameEl.id||"");}}catch(e){frameInfo="_inaccessibleParentFrame";}\r
+var windowName="PopUp_"+location.host.replace(/[^a-z0-9]/gi,"_")+"_"+consoleAppenderId+frameInfo;if(!useOldPopUp||!useDocumentWrite){windowName=windowName+"_"+uniqueId;}\r
+var checkPopUpClosed=function(win){if(consoleClosed){return true;}else{try{return bool(win)&&win.closed;}catch(ex){}}\r
+return false;};var popUpClosedCallback=function(){if(!consoleClosed){appender.unload();}};function finalInit(){getConsoleWindow().setCloseIfOpenerCloses(!useOldPopUp||!useDocumentWrite);consoleWindowLoadHandler();consoleWindowLoaded=true;appendQueuedLoggingEvents();pollConsoleWindow(checkPopUpClosed,500,popUpClosedCallback,"PopUpAppender.checkPopUpClosed: error checking pop-up window");}\r
+try{popUp=window.open(getConsoleUrl(),windowName,windowProperties);consoleClosed=false;consoleWindowCreated=true;if(popUp&&popUp.document){if(useDocumentWrite&&useOldPopUp&&isLoaded(popUp)){popUp.mainPageReloaded();finalInit();}else{if(useDocumentWrite){writeHtml(popUp.document);}\r
+var popUpLoadedTest=function(win){return bool(win)&&isLoaded(win);};if(isLoaded(popUp)){finalInit();}else{pollConsoleWindow(popUpLoadedTest,100,finalInit,"PopUpAppender.init: unable to create console window");}}}else{isSupported=false;logLog.warn("PopUpAppender.init: pop-ups blocked, please unblock to use PopUpAppender");if(complainAboutPopUpBlocking){handleError("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");}}}catch(ex){handleError("PopUpAppender.init: error creating pop-up",ex);}};createWindow=function(){if(!initiallyMinimized){open();}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){return popUp;};safeToAppend=function(){if(isSupported&&!isUndefined(popUp)&&!consoleClosed){if(popUp.closed||(consoleWindowLoaded&&isUndefined(popUp.closed))){appender.unload();logLog.debug("PopUpAppender: pop-up closed");return false;}\r
+if(!consoleWindowLoaded&&isLoaded(popUp)){consoleWindowLoaded=true;}}\r
+return isSupported&&consoleWindowLoaded&&!consoleClosed;};}\r
+this.getConsoleWindow=getConsoleWindow;};ConsoleAppender.addGlobalCommandLineFunction=function(functionName,commandLineFunction){defaultCommandLineFunctions.push([functionName,commandLineFunction]);};function PopUpAppender(lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(false,null,lazyInit,initiallyMinimized,useDocumentWrite,width,height,this.defaults.focusPopUp);}\r
+PopUpAppender.prototype=new ConsoleAppender();PopUpAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,focusPopUp:false,lazyInit:true,useOldPopUp:true,complainAboutPopUpBlocking:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"600",height:"400",reopenWhenClosed:false,maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:true,showLogEntryDeleteButtons:true,useDocumentWrite:true};PopUpAppender.prototype.toString=function(){return"PopUpAppender";};log4javascript.PopUpAppender=PopUpAppender;function InPageAppender(container,lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(true,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,false);}\r
+InPageAppender.prototype=new ConsoleAppender();InPageAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,lazyInit:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"100%",height:"220px",maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:false,showLogEntryDeleteButtons:true,useDocumentWrite:true};InPageAppender.prototype.toString=function(){return"InPageAppender";};log4javascript.InPageAppender=InPageAppender;log4javascript.InlineAppender=InPageAppender;})();function padWithSpaces(str,len){if(str.length<len){var spaces=[];var numberOfSpaces=Math.max(0,len-str.length);for(var i=0;i<numberOfSpaces;i++){spaces[i]=" ";}\r
+str+=spaces.join("");}\r
+return str;}\r
+(function(){function dir(obj){var maxLen=0;for(var p in obj){maxLen=Math.max(toStr(p).length,maxLen);}\r
+var propList=[];for(p in obj){var propNameStr="  "+padWithSpaces(toStr(p),maxLen+2);var propVal;try{propVal=splitIntoLines(toStr(obj[p])).join(padWithSpaces(newLine,maxLen+6));}catch(ex){propVal="[Error obtaining property. Details: "+getExceptionMessage(ex)+"]";}\r
+propList.push(propNameStr+propVal);}\r
+return propList.join(newLine);}\r
+var nodeTypes={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12};var preFormattedElements=["script","pre"];var emptyElements=["br","img","hr","param","link","area","input","col","base","meta"];var indentationUnit="  ";function getXhtml(rootNode,includeRootNode,indentation,startNewLine,preformatted){includeRootNode=(typeof includeRootNode=="undefined")?true:!!includeRootNode;if(typeof indentation!="string"){indentation="";}\r
+startNewLine=!!startNewLine;preformatted=!!preformatted;var xhtml;function isWhitespace(node){return((node.nodeType==nodeTypes.TEXT_NODE)&&/^[ \t\r\n]*$/.test(node.nodeValue));}\r
+function fixAttributeValue(attrValue){return attrValue.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;");}\r
+function getStyleAttributeValue(el){var stylePairs=el.style.cssText.split(";");var styleValue="";var isFirst=true;for(var j=0,len=stylePairs.length;j<len;j++){var nameValueBits=stylePairs[j].split(":");var props=[];if(!/^\s*$/.test(nameValueBits[0])){props.push(trim(nameValueBits[0]).toLowerCase()+":"+trim(nameValueBits[1]));}\r
+styleValue=props.join(";");}\r
+return styleValue;}\r
+function getNamespace(el){if(el.prefix){return el.prefix;}else if(el.outerHTML){var regex=new RegExp("<([^:]+):"+el.tagName+"[^>]*>","i");if(regex.test(el.outerHTML)){return RegExp.$1.toLowerCase();}}\r
+return"";}\r
+var lt="<";var gt=">";if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}\r
+xhtml+=tagName;for(i=0,len=rootNode.attributes.length;i<len;i++){var currentAttr=rootNode.attributes[i];if(!currentAttr.specified||currentAttr.nodeValue===null||currentAttr.nodeName.toLowerCase()==="style"||typeof currentAttr.nodeValue!=="string"||currentAttr.nodeName.indexOf("_moz")===0){continue;}\r
+xhtml+=" "+currentAttr.nodeName.toLowerCase()+"=\"";xhtml+=fixAttributeValue(currentAttr.nodeValue);xhtml+="\"";}\r
+if(rootNode.style.cssText){var styleValue=getStyleAttributeValue(rootNode);if(styleValue!==""){xhtml+=" style=\""+getStyleAttributeValue(rootNode)+"\"";}}\r
+if(array_contains(emptyElements,tagName)||(hasPrefix&&!rootNode.hasChildNodes())){xhtml+="/"+gt;}else{xhtml+=gt;var childStartNewLine=!(rootNode.childNodes.length===1&&rootNode.childNodes[0].nodeType===nodeTypes.TEXT_NODE);var childPreformatted=array_contains(preFormattedElements,tagName);for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation+indentationUnit,childStartNewLine,childPreformatted);}\r
+var endTag=lt+"/"+tagName+gt;xhtml+=childStartNewLine?newLine+indentation+endTag:endTag;}\r
+return xhtml;case nodeTypes.TEXT_NODE:if(isWhitespace(rootNode)){xhtml="";}else{if(preformatted){xhtml=rootNode.nodeValue;}else{var lines=splitIntoLines(trim(rootNode.nodeValue));var trimmedLines=[];for(var i=0,len=lines.length;i<len;i++){trimmedLines[i]=trim(lines[i]);}\r
+xhtml=trimmedLines.join(newLine+indentation);}\r
+if(startNewLine){xhtml=newLine+indentation+xhtml;}}\r
+return xhtml;case nodeTypes.CDATA_SECTION_NODE:return"<![CDA"+"TA["+rootNode.nodeValue+"]"+"]>"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation);}\r
+return xhtml;default:return"";}}else{xhtml="";for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation+indentationUnit);}\r
+return xhtml;}}\r
+function createCommandLineFunctions(){ConsoleAppender.addGlobalCommandLineFunction("$",function(appender,args,returnValue){return document.getElementById(args[0]);});ConsoleAppender.addGlobalCommandLineFunction("dir",function(appender,args,returnValue){var lines=[];for(var i=0,len=args.length;i<len;i++){lines[i]=dir(args[i]);}\r
+return lines.join(newLine+newLine);});ConsoleAppender.addGlobalCommandLineFunction("dirxml",function(appender,args,returnValue){var lines=[];for(var i=0,len=args.length;i<len;i++){var win=appender.getCommandWindow();lines[i]=getXhtml(args[i]);}\r
+return lines.join(newLine+newLine);});ConsoleAppender.addGlobalCommandLineFunction("cd",function(appender,args,returnValue){var win,message;if(args.length===0||args[0]===""){win=window;message="Command line set to run in main window";}else{if(args[0].window==args[0]){win=args[0];message="Command line set to run in frame '"+args[0].name+"'";}else{win=window.frames[args[0]];if(win){message="Command line set to run in frame '"+args[0]+"'";}else{returnValue.isError=true;message="Frame '"+args[0]+"' does not exist";win=appender.getCommandWindow();}}}\r
+appender.setCommandWindow(win);return message;});ConsoleAppender.addGlobalCommandLineFunction("clear",function(appender,args,returnValue){returnValue.appendResult=false;appender.clear();});ConsoleAppender.addGlobalCommandLineFunction("keys",function(appender,args,returnValue){var keys=[];for(var k in args[0]){keys.push(k);}\r
+return keys;});ConsoleAppender.addGlobalCommandLineFunction("values",function(appender,args,returnValue){var values=[];for(var k in args[0]){try{values.push(args[0][k]);}catch(ex){logLog.warn("values(): Unable to obtain value for key "+k+". Details: "+getExceptionMessage(ex));}}\r
+return values;});ConsoleAppender.addGlobalCommandLineFunction("expansionDepth",function(appender,args,returnValue){var expansionDepth=parseInt(args[0],10);if(isNaN(expansionDepth)||expansionDepth<0){returnValue.isError=true;return""+args[0]+" is not a valid expansion depth";}else{appender.setCommandLineObjectExpansionDepth(expansionDepth);return"Object expansion depth set to "+expansionDepth;}});}\r
+function init(){createCommandLineFunctions();}\r
+init();})();log4javascript.setDocumentReady=function(){pageLoaded=true;log4javascript.dispatchEvent("load",{});};if(window.addEventListener){window.addEventListener("load",log4javascript.setDocumentReady,false);}else if(window.attachEvent){window.attachEvent("onload",log4javascript.setDocumentReady);}else{var oldOnload=window.onload;if(typeof window.onload!="function"){window.onload=log4javascript.setDocumentReady;}else{window.onload=function(evt){if(oldOnload){oldOnload(evt);}\r
+log4javascript.setDocumentReady();};}}\r
+window.log4javascript=log4javascript;return log4javascript;})();\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite.js
new file mode 100644 (file)
index 0000000..b04ce8e
--- /dev/null
@@ -0,0 +1,55 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length--;return firstItem;}};}\r
+var log4javascript;(function(){var newLine="\r\n";function Log4JavaScript(){}\r
+log4javascript=new Log4JavaScript();log4javascript.version="1.4.6";log4javascript.edition="log4javascript_lite";function getExceptionMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}else{return String(ex);}}\r
+function getUrlFileName(url){var lastSlashIndex=Math.max(url.lastIndexOf("/"),url.lastIndexOf("\\"));return url.substr(lastSlashIndex+1);}\r
+function getExceptionStringRep(ex){if(ex){var exStr="Exception: "+getExceptionMessage(ex);try{if(ex.lineNumber){exStr+=" on line number "+ex.lineNumber;}\r
+if(ex.fileName){exStr+=" in file "+getUrlFileName(ex.fileName);}}catch(localEx){}\r
+if(showStackTraces&&ex.stack){exStr+=newLine+"Stack trace:"+newLine+ex.stack;}\r
+return exStr;}\r
+return null;}\r
+function isError(err){return(err instanceof Error);}\r
+function bool(obj){return Boolean(obj);}\r
+var enabled=(typeof log4javascript_disabled!="undefined")&&log4javascript_disabled?false:true;log4javascript.setEnabled=function(enable){enabled=bool(enable);};log4javascript.isEnabled=function(){return enabled;};var showStackTraces=false;log4javascript.setShowStackTraces=function(show){showStackTraces=bool(show);};var Level=function(level,name){this.level=level;this.name=name;};Level.prototype={toString:function(){return this.name;},equals:function(level){return this.level==level.level;},isGreaterOrEqual:function(level){return this.level>=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Appender(){var getConsoleHtmlLines=function(){return['<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">','<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">','<head>','<title>log4javascript</title>','<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />','<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->','<meta http-equiv="X-UA-Compatible" content="IE=7" />','<script type="text/javascript">','//<![CDATA[','var loggingEnabled=true;var messagesBeforeDocLoaded=[];function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}','function setLoggingEnabled(enable){loggingEnabled=enable;}','function scrollToLatestEntry(){var l=getLogContainer();if(typeof l.scrollTop!="undefined"){var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}','function log(logLevel,formattedMessage){if(loggingEnabled){if(loaded){doLog(logLevel,formattedMessage);}else{messagesBeforeDocLoaded.push([logLevel,formattedMessage]);}}}','function doLog(logLevel,formattedMessage){var logEntry=document.createElement("div");logEntry.appendChild(document.createTextNode(formattedMessage));logEntry.className="logentry "+logLevel.name;getLogContainer().appendChild(logEntry);scrollToLatestEntry();}','function mainPageReloaded(){var separator=document.createElement("div");separator.className="separator";separator.innerHTML="&nbsp;";getLogContainer().appendChild(separator);}','var loaded=false;var logLevels=["DEBUG","INFO","WARN","ERROR","FATAL"];window.onload=function(){setLogContainerHeight();toggleLoggingEnabled();for(var i=0;i<messagesBeforeDocLoaded.length;i++){doLog(messagesBeforeDocLoaded[i][0],messagesBeforeDocLoaded[i][1]);}','messagesBeforeDocLoaded=[];loaded=true;setTimeout(setLogContainerHeight,20);};function getLogContainer(){return $("log");}','function clearLog(){getLogContainer().innerHTML="";}','function $(id){return document.getElementById(id);}','function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}','return 0;}','function getChromeHeight(){return $("toolbar").offsetHeight;}','function setLogContainerHeight(){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";getLogContainer().style.height=""+','Math.max(0,windowHeight-getChromeHeight())+"px";}','window.onresize=function(){setLogContainerHeight();};','//]]>','</script>','<style type="text/css">','body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div#toolbar input.button{padding:0 5px;font-size:100%}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both}*.logentry{overflow:visible;white-space:pre}*.TRACE{color:#666666}*.DEBUG{color:green}*.INFO{color:#000099}*.WARN{color:#999900}*.ERROR{color:red}*.FATAL{color:#660066}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}','</style>','</head>','<body id="body">','<div id="toolbar">','Options:','<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" class="stateful" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Enable logging</label>','<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="stateful button" title="Clear all log messages"  />','<input type="button" id="closeButton" value="Close" onclick="window.close()" class="stateful button" title="Close the window" />','</div>','<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>','</body>','</html>'];};var popUp=null;var popUpsBlocked=false;var popUpClosed=false;var popUpLoaded=false;var complainAboutPopUpBlocking=true;var initialized=false;var isSupported=true;var width=600;var height=400;var focusPopUp=false;var queuedLoggingEvents=new Array();function isLoaded(win){try{return bool(win.loaded);}catch(ex){return false;}}\r
+function finalInit(){popUpLoaded=true;appendQueuedLoggingEvents();}\r
+function writeHtml(doc){var lines=getConsoleHtmlLines();doc.open();for(var i=0,len=lines.length;i<len;i++){doc.writeln(lines[i]);}\r
+doc.close();}\r
+function pollConsoleWindow(){function pollConsoleWindowLoaded(){if(popUpLoaded){clearInterval(poll);}else if(bool(popUp)&&isLoaded(popUp)){clearInterval(poll);finalInit();}}\r
+var poll=setInterval(pollConsoleWindowLoaded,100);}\r
+function init(){var windowProperties="width="+width+",height="+height+",status,resizable";var windowName="log4javascriptLitePopUp"+location.host.replace(/[^a-z0-9]/gi,"_");popUp=window.open("",windowName,windowProperties);popUpClosed=false;if(popUp){if(isLoaded(popUp)){popUp.mainPageReloaded();finalInit();}else{writeHtml(popUp.document);if(isLoaded(popUp)){finalInit();}else{pollConsoleWindow();}}}else{isSupported=false;if(complainAboutPopUpBlocking){alert("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");}}\r
+initialized=true;}\r
+function safeToAppend(){if(!popUpsBlocked&&!popUpClosed){if(popUp.closed){popUpClosed=true;return false;}\r
+if(!popUpLoaded&&popUp.loaded){popUpLoaded=true;}}\r
+return!popUpsBlocked&&popUpLoaded&&!popUpClosed;}\r
+function padWithZeroes(num,len){var str=""+num;while(str.length<len){str="0"+str;}\r
+return str;}\r
+function padWithSpaces(str,len){while(str.length<len){str+=" ";}\r
+return str;}\r
+this.append=function(loggingEvent){if(!initialized){init();}\r
+queuedLoggingEvents.push(loggingEvent);if(safeToAppend()){appendQueuedLoggingEvents();}};function appendQueuedLoggingEvents(){if(safeToAppend()){while(queuedLoggingEvents.length>0){var currentLoggingEvent=queuedLoggingEvents.shift();var date=currentLoggingEvent.timeStamp;var formattedDate=padWithZeroes(date.getHours(),2)+":"+\r
+padWithZeroes(date.getMinutes(),2)+":"+padWithZeroes(date.getSeconds(),2);var formattedMessage=formattedDate+" "+padWithSpaces(currentLoggingEvent.level.name,5)+" - "+currentLoggingEvent.getCombinedMessages();var throwableStringRep=currentLoggingEvent.getThrowableStrRep();if(throwableStringRep){formattedMessage+=newLine+throwableStringRep;}\r
+popUp.log(currentLoggingEvent.level,formattedMessage);}\r
+if(focusPopUp){popUp.focus();}}}}\r
+log4javascript.Appender=Appender;function Logger(){var appender=new Appender();var loggerLevel=Level.ALL;this.log=function(level,params){if(enabled&&level.isGreaterOrEqual(this.getLevel())){var exception;var finalParamIndex=params.length-1;var lastParam=params[params.length-1];if(params.length>1&&isError(lastParam)){exception=lastParam;finalParamIndex--;}\r
+var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];}\r
+var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);appender.append(loggingEvent);}};this.setLevel=function(level){loggerLevel=level;};this.getLevel=function(){return loggerLevel;};}\r
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=new Logger();}\r
+return defaultLogger;};log4javascript.getLogger=log4javascript.getDefaultLogger;var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger();nullLogger.setLevel(Level.OFF);}\r
+return nullLogger;};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length===1)?this.messages[0]:this.messages.join(newLine);}};log4javascript.LoggingEvent=LoggingEvent;window.log4javascript=log4javascript;})();\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_lite_uncompressed.js
new file mode 100644 (file)
index 0000000..12e97d8
--- /dev/null
@@ -0,0 +1,620 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+if (!Array.prototype.shift) {\r
+       Array.prototype.shift = function() {\r
+               if (this.length > 0) {\r
+                       var firstItem = this[0];\r
+                       for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                               this[i] = this[i + 1];\r
+                       }\r
+                       this.length--;\r
+                       return firstItem;\r
+               }\r
+       };\r
+}\r
+\r
+var log4javascript;\r
+\r
+(function() {\r
+       var newLine = "\r\n";\r
+       function Log4JavaScript() {}\r
+       log4javascript = new Log4JavaScript();\r
+       log4javascript.version = "1.4.6";\r
+       log4javascript.edition = "log4javascript_lite";\r
+\r
+       function getExceptionMessage(ex) {\r
+               if (ex.message) {\r
+                       return ex.message;\r
+               } else if (ex.description) {\r
+                       return ex.description;\r
+               } else {\r
+                       return String(ex);\r
+               }\r
+       }\r
+\r
+       // Gets the portion of the URL after the last slash\r
+       function getUrlFileName(url) {\r
+               var lastSlashIndex = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));\r
+               return url.substr(lastSlashIndex + 1);\r
+       }\r
+\r
+       // Returns a nicely formatted representation of an error\r
+       function getExceptionStringRep(ex) {\r
+               if (ex) {\r
+                       var exStr = "Exception: " + getExceptionMessage(ex);\r
+                       try {\r
+                               if (ex.lineNumber) {\r
+                                       exStr += " on line number " + ex.lineNumber;\r
+                               }\r
+                               if (ex.fileName) {\r
+                                       exStr += " in file " + getUrlFileName(ex.fileName);\r
+                               }\r
+                       } catch (localEx) {\r
+                       }\r
+                       if (showStackTraces && ex.stack) {\r
+                               exStr += newLine + "Stack trace:" + newLine + ex.stack;\r
+                       }\r
+                       return exStr;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       function isError(err) {\r
+               return (err instanceof Error);\r
+       }\r
+\r
+       function bool(obj) {\r
+               return Boolean(obj);\r
+       }\r
+\r
+       var enabled = (typeof log4javascript_disabled != "undefined") &&\r
+               log4javascript_disabled ? false : true;\r
+\r
+       log4javascript.setEnabled = function(enable) {\r
+               enabled = bool(enable);\r
+       };\r
+\r
+       log4javascript.isEnabled = function() {\r
+               return enabled;\r
+       };\r
+\r
+       var showStackTraces = false;\r
+\r
+       log4javascript.setShowStackTraces = function(show) {\r
+               showStackTraces = bool(show);\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Levels\r
+\r
+       var Level = function(level, name) {\r
+               this.level = level;\r
+               this.name = name;\r
+       };\r
+\r
+       Level.prototype = {\r
+               toString: function() {\r
+                       return this.name;\r
+               },\r
+               equals: function(level) {\r
+                       return this.level == level.level;\r
+               },\r
+               isGreaterOrEqual: function(level) {\r
+                       return this.level >= level.level;\r
+               }\r
+       };\r
+\r
+       Level.ALL = new Level(Number.MIN_VALUE, "ALL");\r
+       Level.TRACE = new Level(10000, "TRACE");\r
+       Level.DEBUG = new Level(20000, "DEBUG");\r
+       Level.INFO = new Level(30000, "INFO");\r
+       Level.WARN = new Level(40000, "WARN");\r
+       Level.ERROR = new Level(50000, "ERROR");\r
+       Level.FATAL = new Level(60000, "FATAL");\r
+       Level.OFF = new Level(Number.MAX_VALUE, "OFF");\r
+\r
+       log4javascript.Level = Level;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Appenders\r
+\r
+       function Appender() {\r
+               var getConsoleHtmlLines = function() {\r
+                       return [\r
+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',\r
+'<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">',\r
+'      <head>',\r
+'              <title>log4javascript</title>',\r
+'              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />',\r
+'              <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->',\r
+'              <meta http-equiv="X-UA-Compatible" content="IE=7" />',\r
+'              <script type="text/javascript">',\r
+'                      //<![CDATA[',\r
+'                      var loggingEnabled = true;',\r
+'                      var messagesBeforeDocLoaded = [];',\r
+'',\r
+'                      function toggleLoggingEnabled() {',\r
+'                              setLoggingEnabled($("enableLogging").checked);',\r
+'                      }',\r
+'',\r
+'                      function setLoggingEnabled(enable) {',\r
+'                              loggingEnabled = enable;',\r
+'                      }',\r
+'',\r
+'                      function scrollToLatestEntry() {',\r
+'                              var l = getLogContainer();',\r
+'                              if (typeof l.scrollTop != "undefined") {',\r
+'                                      var latestLogEntry = l.lastChild;',\r
+'                                      if (latestLogEntry) {',\r
+'                                              l.scrollTop = l.scrollHeight;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function log(logLevel, formattedMessage) {',\r
+'                              if (loggingEnabled) {',\r
+'                                      if (loaded) {',\r
+'                                              doLog(logLevel, formattedMessage);',\r
+'                                      } else {',\r
+'                                              messagesBeforeDocLoaded.push([logLevel, formattedMessage]);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function doLog(logLevel, formattedMessage) {',\r
+'                              var logEntry = document.createElement("div");',\r
+'                              logEntry.appendChild(document.createTextNode(formattedMessage));',\r
+'                              logEntry.className = "logentry " + logLevel.name;',\r
+'                              getLogContainer().appendChild(logEntry);',\r
+'                              scrollToLatestEntry();',\r
+'                      }',\r
+'',\r
+'                      function mainPageReloaded() {',\r
+'                              var separator = document.createElement("div");',\r
+'                              separator.className = "separator";',\r
+'                              separator.innerHTML = "&nbsp;";',\r
+'                              getLogContainer().appendChild(separator);',\r
+'                      }',\r
+'',\r
+'                      var loaded = false;',\r
+'                      var logLevels = ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"];',\r
+'',\r
+'                      window.onload = function() {',\r
+'                              setLogContainerHeight();',\r
+'                              toggleLoggingEnabled();',\r
+'                              for (var i = 0; i < messagesBeforeDocLoaded.length; i++) {',\r
+'                                      doLog(messagesBeforeDocLoaded[i][0], messagesBeforeDocLoaded[i][1]);',\r
+'                              }',\r
+'                              messagesBeforeDocLoaded = [];',\r
+'                              loaded = true;',\r
+'',\r
+'                              // Workaround to make sure log div starts at the correct size',\r
+'                              setTimeout(setLogContainerHeight, 20);',\r
+'                      };',\r
+'',\r
+'                      function getLogContainer() {',\r
+'                              return $("log");',\r
+'                      }',\r
+'',\r
+'                      function clearLog() {',\r
+'                              getLogContainer().innerHTML = "";',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------------- */',\r
+'',\r
+'                      // Other utility functions',\r
+'',\r
+'                      // Syntax borrowed from Prototype library',\r
+'                      function $(id) {',\r
+'                              return document.getElementById(id);',\r
+'                      }',\r
+'',\r
+'                      function getWindowHeight() {',\r
+'                              if (window.innerHeight) {',\r
+'                                      return window.innerHeight;',\r
+'                              } else if (document.documentElement && document.documentElement.clientHeight) {',\r
+'                                      return document.documentElement.clientHeight;',\r
+'                              } else if (document.body) {',\r
+'                                      return document.body.clientHeight;',\r
+'                              }',\r
+'                              return 0;',\r
+'                      }',\r
+'',\r
+'                      function getChromeHeight() {',\r
+'                              return $("toolbar").offsetHeight;',\r
+'                      }',\r
+'',\r
+'                      function setLogContainerHeight() {',\r
+'                              var windowHeight = getWindowHeight();',\r
+'                              $("body").style.height = getWindowHeight() + "px";',\r
+'                              getLogContainer().style.height = "" +',\r
+'                                      Math.max(0, windowHeight - getChromeHeight()) + "px";',\r
+'                      }',\r
+'',\r
+'                      window.onresize = function() {',\r
+'                              setLogContainerHeight();',\r
+'                      };',\r
+'',\r
+'                      //]]>',\r
+'              </script>',\r
+'              <style type="text/css">',\r
+'                      body {',\r
+'                              background-color: white;',\r
+'                              color: black;',\r
+'                              padding: 0;',\r
+'                              margin: 0;',\r
+'                              font-family: tahoma, verdana, arial, helvetica, sans-serif;',\r
+'                              overflow: hidden;',\r
+'                      }',\r
+'                      ',\r
+'                      div#toolbar {',\r
+'                              border-top: solid #ffffff 1px;',\r
+'                              border-bottom: solid #aca899 1px;',\r
+'                              background-color: #f1efe7;',\r
+'                              padding: 3px 5px;',\r
+'                              font-size: 68.75%;',\r
+'                      }',\r
+'',\r
+'                      div#toolbar input.button {',\r
+'                              padding: 0 5px;',\r
+'                              font-size: 100%;',\r
+'                      }',\r
+'',\r
+'                      div#log {',\r
+'                              font-family: Courier New, Courier;',\r
+'                              font-size: 75%;',\r
+'                              width: 100%;',\r
+'                              overflow: auto;',\r
+'                              clear: both;',\r
+'                      }',\r
+'',\r
+'                      *.logentry {',\r
+'                              overflow: visible;',\r
+'                              white-space: pre;',\r
+'                      }',\r
+'',\r
+'                      *.TRACE {',\r
+'                              color: #666666;',\r
+'                      }',\r
+'',\r
+'                      *.DEBUG {',\r
+'                              color: green;',\r
+'                      }',\r
+'',\r
+'                      *.INFO {',\r
+'                              color: #000099;',\r
+'                      }',\r
+'',\r
+'                      *.WARN {',\r
+'                              color: #999900;',\r
+'                      }',\r
+'',\r
+'                      *.ERROR {',\r
+'                              color: red;',\r
+'                      }',\r
+'',\r
+'                      *.FATAL {',\r
+'                              color: #660066;',\r
+'                      }',\r
+'',\r
+'                      div#log div.separator {',\r
+'                              background-color: #cccccc;',\r
+'                              margin: 5px 0;',\r
+'                              line-height: 1px;',\r
+'                      }',\r
+'              </style>',\r
+'      </head>',\r
+'',\r
+'      <body id="body">',\r
+'              <div id="toolbar">',\r
+'                      Options:',\r
+'                      <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" class="stateful" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Enable logging</label>',\r
+'                      <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="stateful button" title="Clear all log messages"  />',\r
+'                      <input type="button" id="closeButton" value="Close" onclick="window.close()" class="stateful button" title="Close the window" />',\r
+'              </div>',\r
+'              <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>',\r
+'      </body>',\r
+'</html>'\r
+];\r
+               };\r
+\r
+               var popUp = null;\r
+               var popUpsBlocked = false;\r
+               var popUpClosed = false;\r
+               var popUpLoaded = false;\r
+               var complainAboutPopUpBlocking = true;\r
+               var initialized = false;\r
+               var isSupported = true;\r
+               var width = 600;\r
+               var height = 400;\r
+               var focusPopUp = false;\r
+               var queuedLoggingEvents = new Array();\r
+\r
+               function isLoaded(win) {\r
+                       try {\r
+                               return bool(win.loaded);\r
+                       } catch (ex) {\r
+                               return false;\r
+                       }\r
+               }\r
+\r
+               function finalInit() {\r
+                       popUpLoaded = true;\r
+                       appendQueuedLoggingEvents();\r
+               }\r
+\r
+               function writeHtml(doc) {\r
+                       var lines = getConsoleHtmlLines();\r
+                       doc.open();\r
+                       for (var i = 0, len = lines.length; i < len; i++) {\r
+                               doc.writeln(lines[i]);\r
+                       }\r
+                       doc.close();\r
+               }\r
+\r
+               function pollConsoleWindow() {\r
+                       function pollConsoleWindowLoaded() {\r
+                               if (popUpLoaded) {\r
+                                       clearInterval(poll);\r
+                               } else if (bool(popUp) && isLoaded(popUp)) {\r
+                                       clearInterval(poll);\r
+                                       finalInit();\r
+                               }\r
+                       }\r
+\r
+                       // Poll the pop-up since the onload event is not reliable\r
+                       var poll = setInterval(pollConsoleWindowLoaded, 100);\r
+               }\r
+\r
+               function init() {\r
+                       var windowProperties = "width=" + width + ",height=" + height + ",status,resizable";\r
+                       var windowName = "log4javascriptLitePopUp" + location.host.replace(/[^a-z0-9]/gi, "_");\r
+\r
+                       popUp = window.open("", windowName, windowProperties);\r
+                       popUpClosed = false;\r
+                       if (popUp) {\r
+                               if (isLoaded(popUp)) {\r
+                                       popUp.mainPageReloaded();\r
+                                       finalInit();\r
+                               } else {\r
+                                       writeHtml(popUp.document);\r
+\r
+                                       // Check if the pop-up window object is available\r
+                                       if (isLoaded(popUp)) {\r
+                                               finalInit();\r
+                                       } else {\r
+                                               pollConsoleWindow();\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               isSupported = false;\r
+                               if (complainAboutPopUpBlocking) {\r
+                                       alert("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");\r
+                               }\r
+                       }\r
+                       initialized = true;\r
+               }\r
+\r
+               function safeToAppend() {\r
+                       if (!popUpsBlocked && !popUpClosed) {\r
+                               if (popUp.closed) {\r
+                                       popUpClosed = true;\r
+                                       return false;\r
+                               }\r
+                               if (!popUpLoaded && popUp.loaded) {\r
+                                       popUpLoaded = true;\r
+                               }\r
+                       }\r
+                       return !popUpsBlocked && popUpLoaded && !popUpClosed;\r
+               }\r
+\r
+               function padWithZeroes(num, len) {\r
+                       var str = "" + num;\r
+                       while (str.length < len) {\r
+                               str = "0" + str;\r
+                       }\r
+                       return str;\r
+               }\r
+\r
+               function padWithSpaces(str, len) {\r
+                       while (str.length < len) {\r
+                               str += " ";\r
+                       }\r
+                       return str;\r
+               }\r
+\r
+               this.append = function(loggingEvent) {\r
+                       if (!initialized) {\r
+                               init();\r
+                       }\r
+                       queuedLoggingEvents.push(loggingEvent);\r
+                       if (safeToAppend()) {\r
+                               appendQueuedLoggingEvents();\r
+                       }\r
+               };\r
+\r
+               function appendQueuedLoggingEvents() {\r
+                       if (safeToAppend()) {\r
+                               while (queuedLoggingEvents.length > 0) {\r
+                                       var currentLoggingEvent = queuedLoggingEvents.shift();\r
+                                       var date = currentLoggingEvent.timeStamp;\r
+                                       var formattedDate = padWithZeroes(date.getHours(), 2) + ":" +\r
+                                               padWithZeroes(date.getMinutes(), 2) + ":" + padWithZeroes(date.getSeconds(), 2);\r
+                                       var formattedMessage = formattedDate + " " + padWithSpaces(currentLoggingEvent.level.name, 5) +\r
+                                               " - " + currentLoggingEvent.getCombinedMessages();\r
+                                       var throwableStringRep = currentLoggingEvent.getThrowableStrRep();\r
+                                       if (throwableStringRep) {\r
+                                               formattedMessage += newLine + throwableStringRep;\r
+                                       }\r
+                                       popUp.log(currentLoggingEvent.level, formattedMessage);\r
+                               }\r
+                               if (focusPopUp) {\r
+                                       popUp.focus();\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       log4javascript.Appender = Appender;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Loggers\r
+\r
+       function Logger() {\r
+               var appender = new Appender();\r
+               var loggerLevel = Level.ALL;\r
+\r
+               this.log = function(level, params) {\r
+                       if (enabled && level.isGreaterOrEqual(this.getLevel())) {\r
+                               // Check whether last param is an exception\r
+                               var exception;\r
+                               var finalParamIndex = params.length - 1;\r
+                               var lastParam = params[params.length - 1];\r
+                               if (params.length > 1 && isError(lastParam)) {\r
+                                       exception = lastParam;\r
+                                       finalParamIndex--;\r
+                               }\r
+\r
+                               // Construct genuine array for the params\r
+                               var messages = [];\r
+                               for (var i = 0; i <= finalParamIndex; i++) {\r
+                                       messages[i] = params[i];\r
+                               }\r
+\r
+                               var loggingEvent = new LoggingEvent(\r
+                                       this, new Date(), level, messages, exception);\r
+\r
+                               appender.append(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.setLevel = function(level) {\r
+                       loggerLevel = level;\r
+               };\r
+\r
+               this.getLevel = function() {\r
+                       return loggerLevel;\r
+               };\r
+       }\r
+\r
+       Logger.prototype = {\r
+               trace: function() {\r
+                       this.log(Level.TRACE, arguments);\r
+               },\r
+\r
+               debug: function() {\r
+                       this.log(Level.DEBUG, arguments);\r
+               },\r
+\r
+               info: function() {\r
+                       this.log(Level.INFO, arguments);\r
+               },\r
+\r
+               warn: function() {\r
+                       this.log(Level.WARN, arguments);\r
+               },\r
+\r
+               error: function() {\r
+                       this.log(Level.ERROR, arguments);\r
+               },\r
+\r
+               fatal: function() {\r
+                       this.log(Level.FATAL, arguments);\r
+               },\r
+\r
+               isEnabledFor: function(level) {\r
+                       return level.isGreaterOrEqual(this.getLevel());\r
+               },\r
+\r
+               isTraceEnabled: function() {\r
+                       return this.isEnabledFor(Level.TRACE);\r
+               },\r
+\r
+               isDebugEnabled: function() {\r
+                       return this.isEnabledFor(Level.DEBUG);\r
+               },\r
+\r
+               isInfoEnabled: function() {\r
+                       return this.isEnabledFor(Level.INFO);\r
+               },\r
+\r
+               isWarnEnabled: function() {\r
+                       return this.isEnabledFor(Level.WARN);\r
+               },\r
+\r
+               isErrorEnabled: function() {\r
+                       return this.isEnabledFor(Level.ERROR);\r
+               },\r
+\r
+               isFatalEnabled: function() {\r
+                       return this.isEnabledFor(Level.FATAL);\r
+               }\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logger access methods\r
+\r
+       var defaultLogger = null;\r
+       log4javascript.getDefaultLogger = function() {\r
+               if (!defaultLogger) {\r
+                       defaultLogger = new Logger();\r
+               }\r
+               return defaultLogger;\r
+       };\r
+\r
+       log4javascript.getLogger = log4javascript.getDefaultLogger;\r
+\r
+       var nullLogger = null;\r
+       log4javascript.getNullLogger = function() {\r
+               if (!nullLogger) {\r
+                       nullLogger = new Logger();\r
+                       nullLogger.setLevel(Level.OFF);\r
+               }\r
+               return nullLogger;\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logging events\r
+\r
+       var LoggingEvent = function(logger, timeStamp, level, messages,\r
+                       exception) {\r
+               this.logger = logger;\r
+               this.timeStamp = timeStamp;\r
+               this.level = level;\r
+               this.messages = messages;\r
+               this.exception = exception;\r
+       };\r
+\r
+       LoggingEvent.prototype = {\r
+               getThrowableStrRep: function() {\r
+                       return this.exception ?\r
+                               getExceptionStringRep(this.exception) : "";\r
+               },\r
+\r
+               getCombinedMessages: function() {\r
+                       return (this.messages.length === 1) ? this.messages[0] :\r
+                                  this.messages.join(newLine);\r
+               }\r
+       };\r
+\r
+       log4javascript.LoggingEvent = LoggingEvent;\r
+\r
+       // Ensure that the log4javascript object is available in the window. This\r
+       // is necessary for log4javascript to be available in IE if loaded using\r
+       // Dojo's module system\r
+       window.log4javascript = log4javascript;\r
+})();
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production.js
new file mode 100644 (file)
index 0000000..1a31299
--- /dev/null
@@ -0,0 +1,188 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}\r
+return this.length;};}\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length=this.length-1;return firstItem;}};}\r
+if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}\r
+var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}\r
+return itemsDeleted;};}\r
+var log4javascript=(function(){function isUndefined(obj){return typeof obj=="undefined";}\r
+function EventSupport(){}\r
+EventSupport.prototype={eventTypes:[],eventListeners:{},setEventTypes:function(eventTypesParam){if(eventTypesParam instanceof Array){this.eventTypes=eventTypesParam;this.eventListeners={};for(var i=0,len=this.eventTypes.length;i<len;i++){this.eventListeners[this.eventTypes[i]]=[];}}else{handleError("log4javascript.EventSupport ["+this+"]: setEventTypes: eventTypes parameter must be an Array");}},addEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: addEventListener: no event called '"+eventType+"'");}\r
+this.eventListeners[eventType].push(listener);}else{handleError("log4javascript.EventSupport ["+this+"]: addEventListener: listener must be a function");}},removeEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: no event called '"+eventType+"'");}\r
+array_remove(this.eventListeners[eventType],listener);}else{handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: listener must be a function");}},dispatchEvent:function(eventType,eventArgs){if(array_contains(this.eventTypes,eventType)){var listeners=this.eventListeners[eventType];for(var i=0,len=listeners.length;i<len;i++){listeners[i](this,eventType,eventArgs);}}else{handleError("log4javascript.EventSupport ["+this+"]: dispatchEvent: no event called '"+eventType+"'");}}};var applicationStartDate=new Date();var uniqueId="log4javascript_"+applicationStartDate.getTime()+"_"+\r
+Math.floor(Math.random()*100000000);var emptyFunction=function(){};var newLine="\r\n";var pageLoaded=false;function Log4JavaScript(){}\r
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript.version="1.4.6";log4javascript.edition="log4javascript_production";function toStr(obj){if(obj&&obj.toString){return obj.toString();}else{return String(obj);}}\r
+function getExceptionMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}else{return toStr(ex);}}\r
+function getUrlFileName(url){var lastSlashIndex=Math.max(url.lastIndexOf("/"),url.lastIndexOf("\\"));return url.substr(lastSlashIndex+1);}\r
+function getExceptionStringRep(ex){if(ex){var exStr="Exception: "+getExceptionMessage(ex);try{if(ex.lineNumber){exStr+=" on line number "+ex.lineNumber;}\r
+if(ex.fileName){exStr+=" in file "+getUrlFileName(ex.fileName);}}catch(localEx){logLog.warn("Unable to obtain file and line information for error");}\r
+if(showStackTraces&&ex.stack){exStr+=newLine+"Stack trace:"+newLine+ex.stack;}\r
+return exStr;}\r
+return null;}\r
+function bool(obj){return Boolean(obj);}\r
+function trim(str){return str.replace(/^\s+/,"").replace(/\s+$/,"");}\r
+function splitIntoLines(text){var text2=text.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return text2.split("\n");}\r
+var urlEncode=(typeof window.encodeURIComponent!="undefined")?function(str){return encodeURIComponent(str);}:function(str){return escape(str).replace(/\+/g,"%2B").replace(/"/g,"%22").replace(/'/g,"%27").replace(/\//g,"%2F").replace(/=/g,"%3D");};var urlDecode=(typeof window.decodeURIComponent!="undefined")?function(str){return decodeURIComponent(str);}:function(str){return unescape(str).replace(/%2B/g,"+").replace(/%22/g,"\"").replace(/%27/g,"'").replace(/%2F/g,"/").replace(/%3D/g,"=");};function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}\r
+if(index>=0){arr.splice(index,1);return true;}else{return false;}}\r
+function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function extractBooleanFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return bool(param);}}\r
+function extractStringFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return String(param);}}\r
+function extractIntFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{try{var value=parseInt(param,10);return isNaN(value)?defaultValue:value;}catch(ex){logLog.warn("Invalid int param "+param,ex);return defaultValue;}}}\r
+function extractFunctionFromParam(param,defaultValue){if(typeof param=="function"){return param;}else{return defaultValue;}}\r
+function isError(err){return(err instanceof Error);}\r
+if(!Function.prototype.apply){Function.prototype.apply=function(obj,args){var methodName="__apply__";if(typeof obj[methodName]!="undefined"){methodName+=String(Math.random()).substr(2);}\r
+obj[methodName]=this;var argsStrings=[];for(var i=0,len=args.length;i<len;i++){argsStrings[i]="args["+i+"]";}\r
+var script="obj."+methodName+"("+argsStrings.join(",")+")";var returnValue=eval(script);delete obj[methodName];return returnValue;};}\r
+if(!Function.prototype.call){Function.prototype.call=function(obj){var args=[];for(var i=1,len=arguments.length;i<len;i++){args[i-1]=arguments[i];}\r
+return this.apply(obj,args);};}\r
+function getListenersPropertyName(eventName){return"__log4javascript_listeners__"+eventName;}\r
+function addEvent(node,eventName,listener,useCapture,win){win=win?win:window;if(node.addEventListener){node.addEventListener(eventName,listener,useCapture);}else if(node.attachEvent){node.attachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(!node[propertyName]){node[propertyName]=[];node["on"+eventName]=function(evt){evt=getEvent(evt,win);var listenersPropertyName=getListenersPropertyName(eventName);var listeners=this[listenersPropertyName].concat([]);var currentListener;while((currentListener=listeners.shift())){currentListener.call(this,evt);}};}\r
+node[propertyName].push(listener);}}\r
+function removeEvent(node,eventName,listener,useCapture){if(node.removeEventListener){node.removeEventListener(eventName,listener,useCapture);}else if(node.detachEvent){node.detachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(node[propertyName]){array_remove(node[propertyName],listener);}}}\r
+function getEvent(evt,win){win=win?win:window;return evt?evt:win.event;}\r
+function stopEventPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}\r
+evt.returnValue=false;}\r
+var logLog={quietMode:false,debugMessages:[],setQuietMode:function(quietMode){this.quietMode=bool(quietMode);},numberOfErrors:0,alertAllErrors:false,setAlertAllErrors:function(alertAllErrors){this.alertAllErrors=alertAllErrors;},debug:function(message){this.debugMessages.push(message);},displayDebug:function(){alert(this.debugMessages.join(newLine));},warn:function(message,exception){},error:function(message,exception){if(++this.numberOfErrors==1||this.alertAllErrors){if(!this.quietMode){var alertMessage="log4javascript error: "+message;if(exception){alertMessage+=newLine+newLine+"Original error: "+getExceptionStringRep(exception);}\r
+alert(alertMessage);}}}};log4javascript.logLog=logLog;log4javascript.setEventTypes(["load","error"]);function handleError(message,exception){logLog.error(message,exception);log4javascript.dispatchEvent("error",{"message":message,"exception":exception});}\r
+log4javascript.handleError=handleError;var enabled=!((typeof log4javascript_disabled!="undefined")&&log4javascript_disabled);log4javascript.setEnabled=function(enable){enabled=bool(enable);};log4javascript.isEnabled=function(){return enabled;};var useTimeStampsInMilliseconds=true;log4javascript.setTimeStampsInMilliseconds=function(timeStampsInMilliseconds){useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);};log4javascript.isTimeStampsInMilliseconds=function(){return useTimeStampsInMilliseconds;};log4javascript.evalInScope=function(expr){return eval(expr);};var showStackTraces=false;log4javascript.setShowStackTraces=function(show){showStackTraces=bool(show);};var Level=function(level,name){this.level=level;this.name=name;};Level.prototype={toString:function(){return this.name;},equals:function(level){return this.level==level.level;},isGreaterOrEqual:function(level){return this.level>=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}\r
+Timer.prototype.getElapsedTime=function(){return new Date().getTime()-this.start.getTime();};var anonymousLoggerName="[anonymous]";var defaultLoggerName="[default]";var nullLoggerName="[null]";var rootLoggerName="root";function Logger(name){this.name=name;this.parent=null;this.children=[];var appenders=[];var loggerLevel=null;var isRoot=(this.name===rootLoggerName);var isNull=(this.name===nullLoggerName);var appenderCache=null;var appenderCacheInvalidated=false;this.addChild=function(childLogger){this.children.push(childLogger);childLogger.parent=this;childLogger.invalidateAppenderCache();};var additive=true;this.getAdditivity=function(){return additive;};this.setAdditivity=function(additivity){var valueChanged=(additive!=additivity);additive=additivity;if(valueChanged){this.invalidateAppenderCache();}};this.addAppender=function(appender){if(isNull){handleError("Logger.addAppender: you may not add an appender to the null logger");}else{if(appender instanceof log4javascript.Appender){if(!array_contains(appenders,appender)){appenders.push(appender);appender.setAddedToLogger(this);this.invalidateAppenderCache();}}else{handleError("Logger.addAppender: appender supplied ('"+\r
+toStr(appender)+"') is not a subclass of Appender");}}};this.removeAppender=function(appender){array_remove(appenders,appender);appender.setRemovedFromLogger(this);this.invalidateAppenderCache();};this.removeAllAppenders=function(){var appenderCount=appenders.length;if(appenderCount>0){for(var i=0;i<appenderCount;i++){appenders[i].setRemovedFromLogger(this);}\r
+appenders.length=0;this.invalidateAppenderCache();}};this.getEffectiveAppenders=function(){if(appenderCache===null||appenderCacheInvalidated){var parentEffectiveAppenders=(isRoot||!this.getAdditivity())?[]:this.parent.getEffectiveAppenders();appenderCache=parentEffectiveAppenders.concat(appenders);appenderCacheInvalidated=false;}\r
+return appenderCache;};this.invalidateAppenderCache=function(){appenderCacheInvalidated=true;for(var i=0,len=this.children.length;i<len;i++){this.children[i].invalidateAppenderCache();}};this.log=function(level,params){if(enabled&&level.isGreaterOrEqual(this.getEffectiveLevel())){var exception;var finalParamIndex=params.length-1;var lastParam=params[finalParamIndex];if(params.length>1&&isError(lastParam)){exception=lastParam;finalParamIndex--;}\r
+var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];}\r
+var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this.callAppenders(loggingEvent);}};this.callAppenders=function(loggingEvent){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].doAppend(loggingEvent);}};this.setLevel=function(level){if(isRoot&&level===null){handleError("Logger.setLevel: you cannot set the level of the root logger to null");}else if(level instanceof Level){loggerLevel=level;}else{handleError("Logger.setLevel: level supplied to logger "+\r
+this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].group(name,initiallyExpanded);}}};this.groupEnd=function(){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].groupEnd();}}};var timers={};this.time=function(name,level){if(enabled){if(isUndefined(name)){handleError("Logger.time: a name for the timer must be supplied");}else if(level&&!(level instanceof Level)){handleError("Logger.time: level supplied to timer "+\r
+name+" is not an instance of log4javascript.Level");}else{timers[name]=new Timer(name,level);}}};this.timeEnd=function(name){if(enabled){if(isUndefined(name)){handleError("Logger.timeEnd: a name for the timer must be supplied");}else if(timers[name]){var timer=timers[name];var milliseconds=timer.getElapsedTime();this.log(timer.level,["Timer "+toStr(name)+" completed in "+milliseconds+"ms"]);delete timers[name];}else{logLog.warn("Logger.timeEnd: no timer found with name "+name);}}};this.assert=function(expr){if(enabled&&!expr){var args=[];for(var i=1,len=arguments.length;i<len;i++){args.push(arguments[i]);}\r
+args=(args.length>0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}\r
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+\r
+toStr(loggerName)+" supplied, returning anonymous logger");}\r
+if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}\r
+if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}\r
+parentLogger.addChild(logger);}\r
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}\r
+return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}\r
+return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}\r
+if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}\r
+if(this.hasCustomFields()){for(var i=0,len=this.customFields.length;i<len;i++){var val=this.customFields[i].value;if(typeof val==="function"){val=val(this,loggingEvent);}\r
+dataValues.push([this.customFields[i].name,val]);}}\r
+return dataValues;},setKeys:function(loggerKey,timeStampKey,levelKey,messageKey,exceptionKey,urlKey,millisecondsKey){this.loggerKey=extractStringFromParam(loggerKey,this.defaults.loggerKey);this.timeStampKey=extractStringFromParam(timeStampKey,this.defaults.timeStampKey);this.levelKey=extractStringFromParam(levelKey,this.defaults.levelKey);this.messageKey=extractStringFromParam(messageKey,this.defaults.messageKey);this.exceptionKey=extractStringFromParam(exceptionKey,this.defaults.exceptionKey);this.urlKey=extractStringFromParam(urlKey,this.defaults.urlKey);this.millisecondsKey=extractStringFromParam(millisecondsKey,this.defaults.millisecondsKey);},setCustomField:function(name,value){var fieldUpdated=false;for(var i=0,len=this.customFields.length;i<len;i++){if(this.customFields[i].name===name){this.customFields[i].value=value;fieldUpdated=true;}}\r
+if(!fieldUpdated){this.customFields.push({"name":name,"value":value});}},hasCustomFields:function(){return(this.customFields.length>0);},toString:function(){handleError("Layout.toString: all layouts must override this method");}};log4javascript.Layout=Layout;var Appender=function(){};Appender.prototype=new EventSupport();Appender.prototype.layout=new PatternLayout();Appender.prototype.threshold=Level.ALL;Appender.prototype.loggers=[];Appender.prototype.doAppend=function(loggingEvent){if(enabled&&loggingEvent.level.level>=this.threshold.level){this.append(loggingEvent);}};Appender.prototype.append=function(loggingEvent){};Appender.prototype.setLayout=function(layout){if(layout instanceof Layout){this.layout=layout;}else{handleError("Appender.setLayout: layout supplied to "+\r
+this.toString()+" is not a subclass of Layout");}};Appender.prototype.getLayout=function(){return this.layout;};Appender.prototype.setThreshold=function(threshold){if(threshold instanceof Level){this.threshold=threshold;}else{handleError("Appender.setThreshold: threshold supplied to "+\r
+this.toString()+" is not a subclass of Level");}};Appender.prototype.getThreshold=function(){return this.threshold;};Appender.prototype.setAddedToLogger=function(logger){this.loggers.push(logger);};Appender.prototype.setRemovedFromLogger=function(logger){array_remove(this.loggers,logger);};Appender.prototype.group=emptyFunction;Appender.prototype.groupEnd=emptyFunction;Appender.prototype.toString=function(){handleError("Appender.toString: all appenders must override this method");};log4javascript.Appender=Appender;function SimpleLayout(){this.customFields=[];}\r
+SimpleLayout.prototype=new Layout();SimpleLayout.prototype.format=function(loggingEvent){return loggingEvent.level.name+" - "+loggingEvent.getCombinedMessages();};SimpleLayout.prototype.ignoresThrowable=function(){return true;};SimpleLayout.prototype.toString=function(){return"SimpleLayout";};log4javascript.SimpleLayout=SimpleLayout;function NullLayout(){this.customFields=[];}\r
+NullLayout.prototype=new Layout();NullLayout.prototype.format=function(loggingEvent){return loggingEvent.messages;};NullLayout.prototype.ignoresThrowable=function(){return true;};NullLayout.prototype.toString=function(){return"NullLayout";};log4javascript.NullLayout=NullLayout;function XmlLayout(combineMessages){this.combineMessages=extractBooleanFromParam(combineMessages,true);this.customFields=[];}\r
+XmlLayout.prototype=new Layout();XmlLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};XmlLayout.prototype.getContentType=function(){return"text/xml";};XmlLayout.prototype.escapeCdata=function(str){return str.replace(/\]\]>/,"]]>]]&gt;<![CDATA[");};XmlLayout.prototype.format=function(loggingEvent){var layout=this;var i,len;function formatMessage(message){message=(typeof message==="string")?message:toStr(message);return"<log4javascript:message><![CDATA["+\r
+layout.escapeCdata(message)+"]]></log4javascript:message>";}\r
+var str="<log4javascript:event logger=\""+loggingEvent.logger.name+"\" timestamp=\""+this.getTimeStampValue(loggingEvent)+"\"";if(!this.isTimeStampsInMilliseconds()){str+=" milliseconds=\""+loggingEvent.milliseconds+"\"";}\r
+str+=" level=\""+loggingEvent.level.name+"\">"+newLine;if(this.combineMessages){str+=formatMessage(loggingEvent.getCombinedMessages());}else{str+="<log4javascript:messages>"+newLine;for(i=0,len=loggingEvent.messages.length;i<len;i++){str+=formatMessage(loggingEvent.messages[i])+newLine;}\r
+str+="</log4javascript:messages>"+newLine;}\r
+if(this.hasCustomFields()){for(i=0,len=this.customFields.length;i<len;i++){str+="<log4javascript:customfield name=\""+\r
+this.customFields[i].name+"\"><![CDATA["+\r
+this.customFields[i].value.toString()+"]]></log4javascript:customfield>"+newLine;}}\r
+if(loggingEvent.exception){str+="<log4javascript:exception><![CDATA["+\r
+getExceptionStringRep(loggingEvent.exception)+"]]></log4javascript:exception>"+newLine;}\r
+str+="</log4javascript:event>"+newLine+newLine;return str;};XmlLayout.prototype.ignoresThrowable=function(){return false;};XmlLayout.prototype.toString=function(){return"XmlLayout";};log4javascript.XmlLayout=XmlLayout;function escapeNewLines(str){return str.replace(/\r\n|\r|\n/g,"\\r\\n");}\r
+function JsonLayout(readable,combineMessages){this.readable=extractBooleanFromParam(readable,false);this.combineMessages=extractBooleanFromParam(combineMessages,true);this.batchHeader=this.readable?"["+newLine:"[";this.batchFooter=this.readable?"]"+newLine:"]";this.batchSeparator=this.readable?","+newLine:",";this.setKeys();this.colon=this.readable?": ":":";this.tab=this.readable?"\t":"";this.lineBreak=this.readable?newLine:"";this.customFields=[];}\r
+JsonLayout.prototype=new Layout();JsonLayout.prototype.isReadable=function(){return this.readable;};JsonLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};JsonLayout.prototype.format=function(loggingEvent){var layout=this;var dataValues=this.getDataValues(loggingEvent,this.combineMessages);var str="{"+this.lineBreak;var i,len;function formatValue(val,prefix,expand){var formattedValue;var valType=typeof val;if(val instanceof Date){formattedValue=String(val.getTime());}else if(expand&&(val instanceof Array)){formattedValue="["+layout.lineBreak;for(var i=0,len=val.length;i<len;i++){var childPrefix=prefix+layout.tab;formattedValue+=childPrefix+formatValue(val[i],childPrefix,false);if(i<val.length-1){formattedValue+=",";}\r
+formattedValue+=layout.lineBreak;}\r
+formattedValue+=prefix+"]";}else if(valType!=="number"&&valType!=="boolean"){formattedValue="\""+escapeNewLines(toStr(val).replace(/\"/g,"\\\""))+"\"";}else{formattedValue=val;}\r
+return formattedValue;}\r
+for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+"\""+this.colon+formatValue(dataValues[i][1],this.tab,true);if(i<len){str+=",";}\r
+str+=this.lineBreak;}\r
+str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}\r
+HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i<len;i++){var val=(dataValues[i][1]instanceof Date)?String(dataValues[i][1].getTime()):dataValues[i][1];queryBits.push(urlEncode(dataValues[i][0])+"="+urlEncode(val));}\r
+return queryBits.join("&");};HttpPostDataLayout.prototype.ignoresThrowable=function(loggingEvent){return false;};HttpPostDataLayout.prototype.toString=function(){return"HttpPostDataLayout";};log4javascript.HttpPostDataLayout=HttpPostDataLayout;function formatObjectExpansion(obj,depth,indentation){var objectsExpanded=[];function doFormat(obj,depth,indentation){var i,j,len,childDepth,childIndentation,childLines,expansion,childExpansion;if(!indentation){indentation="";}\r
+function formatString(text){var lines=splitIntoLines(text);for(var j=1,jLen=lines.length;j<jLen;j++){lines[j]=indentation+lines[j];}\r
+return lines.join(newLine);}\r
+if(obj===null){return"null";}else if(typeof obj=="undefined"){return"undefined";}else if(typeof obj=="string"){return formatString(obj);}else if(typeof obj=="object"&&array_contains(objectsExpanded,obj)){try{expansion=toStr(obj);}catch(ex){expansion="Error formatting property. Details: "+getExceptionStringRep(ex);}\r
+return expansion+" [already expanded]";}else if((obj instanceof Array)&&depth>0){objectsExpanded.push(obj);expansion="["+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i=0,len=obj.length;i<len;i++){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+childExpansion);}catch(ex){childLines.push(childIndentation+"Error formatting array member. Details: "+\r
+getExceptionStringRep(ex)+"");}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"]";return expansion;}else if(Object.prototype.toString.call(obj)=="[object Date]"){return obj.toString();}else if(typeof obj=="object"&&depth>0){objectsExpanded.push(obj);expansion="{"+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i in obj){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+i+": "+childExpansion);}catch(ex){childLines.push(childIndentation+i+": Error formatting property. Details: "+\r
+getExceptionStringRep(ex));}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"}";return expansion;}else{return formatString(toStr(obj));}}\r
+return doFormat(obj,depth,indentation);}\r
+var SimpleDateFormat;(function(){var regex=/('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;var monthNames=["January","February","March","April","May","June","July","August","September","October","November","December"];var dayNames=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var TEXT2=0,TEXT3=1,NUMBER=2,YEAR=3,MONTH=4,TIMEZONE=5;var types={G:TEXT2,y:YEAR,M:MONTH,w:NUMBER,W:NUMBER,D:NUMBER,d:NUMBER,F:NUMBER,E:TEXT3,a:TEXT2,H:NUMBER,k:NUMBER,K:NUMBER,h:NUMBER,m:NUMBER,s:NUMBER,S:NUMBER,Z:TIMEZONE};var ONE_DAY=24*60*60*1000;var ONE_WEEK=7*ONE_DAY;var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK=1;var newDateAtMidnight=function(year,month,day){var d=new Date(year,month,day,0,0,0);d.setMilliseconds(0);return d;};Date.prototype.getDifference=function(date){return this.getTime()-date.getTime();};Date.prototype.isBefore=function(d){return this.getTime()<d.getTime();};Date.prototype.getUTCTime=function(){return Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());};Date.prototype.getTimeSince=function(d){return this.getUTCTime()-d.getUTCTime();};Date.prototype.getPreviousSunday=function(){var midday=new Date(this.getFullYear(),this.getMonth(),this.getDate(),12,0,0);var previousSunday=new Date(midday.getTime()-this.getDay()*ONE_DAY);return newDateAtMidnight(previousSunday.getFullYear(),previousSunday.getMonth(),previousSunday.getDate());};Date.prototype.getWeekInYear=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);var numberOfSundays=previousSunday.isBefore(startOfYear)?0:1+Math.floor(previousSunday.getTimeSince(startOfYear)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfYear.getDay();var weekInYear=numberOfSundays;if(numberOfDaysInFirstWeek<minimalDaysInFirstWeek){weekInYear--;}\r
+return weekInYear;};Date.prototype.getWeekInMonth=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfMonth=newDateAtMidnight(this.getFullYear(),this.getMonth(),1);var numberOfSundays=previousSunday.isBefore(startOfMonth)?0:1+Math.floor(previousSunday.getTimeSince(startOfMonth)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfMonth.getDay();var weekInMonth=numberOfSundays;if(numberOfDaysInFirstWeek>=minimalDaysInFirstWeek){weekInMonth++;}\r
+return weekInMonth;};Date.prototype.getDayInYear=function(){var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);return 1+Math.floor(this.getTimeSince(startOfYear)/ONE_DAY);};SimpleDateFormat=function(formatString){this.formatString=formatString;};SimpleDateFormat.prototype.setMinimalDaysInFirstWeek=function(days){this.minimalDaysInFirstWeek=days;};SimpleDateFormat.prototype.getMinimalDaysInFirstWeek=function(){return isUndefined(this.minimalDaysInFirstWeek)?DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK:this.minimalDaysInFirstWeek;};var padWithZeroes=function(str,len){while(str.length<len){str="0"+str;}\r
+return str;};var formatText=function(data,numberOfLetters,minLength){return(numberOfLetters>=4)?data:data.substr(0,Math.max(minLength,numberOfLetters));};var formatNumber=function(data,numberOfLetters){var dataString=""+data;return padWithZeroes(dataString,numberOfLetters);};SimpleDateFormat.prototype.format=function(date){var formattedString="";var result;var searchString=this.formatString;while((result=regex.exec(searchString))){var quotedString=result[1];var patternLetters=result[2];var otherLetters=result[3];var otherCharacters=result[4];if(quotedString){if(quotedString=="''"){formattedString+="'";}else{formattedString+=quotedString.substring(1,quotedString.length-1);}}else if(otherLetters){}else if(otherCharacters){formattedString+=otherCharacters;}else if(patternLetters){var patternLetter=patternLetters.charAt(0);var numberOfLetters=patternLetters.length;var rawData="";switch(patternLetter){case"G":rawData="AD";break;case"y":rawData=date.getFullYear();break;case"M":rawData=date.getMonth();break;case"w":rawData=date.getWeekInYear(this.getMinimalDaysInFirstWeek());break;case"W":rawData=date.getWeekInMonth(this.getMinimalDaysInFirstWeek());break;case"D":rawData=date.getDayInYear();break;case"d":rawData=date.getDate();break;case"F":rawData=1+Math.floor((date.getDate()-1)/7);break;case"E":rawData=dayNames[date.getDay()];break;case"a":rawData=(date.getHours()>=12)?"PM":"AM";break;case"H":rawData=date.getHours();break;case"k":rawData=date.getHours()||24;break;case"K":rawData=date.getHours()%12;break;case"h":rawData=(date.getHours()%12)||12;break;case"m":rawData=date.getMinutes();break;case"s":rawData=date.getSeconds();break;case"S":rawData=date.getMilliseconds();break;case"Z":rawData=date.getTimezoneOffset();break;}\r
+switch(types[patternLetter]){case TEXT2:formattedString+=formatText(rawData,numberOfLetters,2);break;case TEXT3:formattedString+=formatText(rawData,numberOfLetters,3);break;case NUMBER:formattedString+=formatNumber(rawData,numberOfLetters);break;case YEAR:if(numberOfLetters<=3){var dataString=""+rawData;formattedString+=dataString.substr(2,2);}else{formattedString+=formatNumber(rawData,numberOfLetters);}\r
+break;case MONTH:if(numberOfLetters>=3){formattedString+=formatText(monthNames[rawData],numberOfLetters,numberOfLetters);}else{formattedString+=formatNumber(rawData+1,numberOfLetters);}\r
+break;case TIMEZONE:var isPositive=(rawData>0);var prefix=isPositive?"-":"+";var absData=Math.abs(rawData);var hours=""+Math.floor(absData/60);hours=padWithZeroes(hours,2);var minutes=""+(absData%60);minutes=padWithZeroes(minutes,2);formattedString+=prefix+hours+minutes;break;}}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};})();log4javascript.SimpleDateFormat=SimpleDateFormat;function PatternLayout(pattern){if(pattern){this.pattern=pattern;}else{this.pattern=PatternLayout.DEFAULT_CONVERSION_PATTERN;}\r
+this.customFields=[];}\r
+PatternLayout.TTCC_CONVERSION_PATTERN="%r %p %c - %m%n";PatternLayout.DEFAULT_CONVERSION_PATTERN="%m%n";PatternLayout.ISO8601_DATEFORMAT="yyyy-MM-dd HH:mm:ss,SSS";PatternLayout.DATETIME_DATEFORMAT="dd MMM yyyy HH:mm:ss,SSS";PatternLayout.ABSOLUTETIME_DATEFORMAT="HH:mm:ss,SSS";PatternLayout.prototype=new Layout();PatternLayout.prototype.format=function(loggingEvent){var regex=/%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;var formattedString="";var result;var searchString=this.pattern;while((result=regex.exec(searchString))){var matchedString=result[0];var padding=result[1];var truncation=result[2];var conversionCharacter=result[3];var specifier=result[5];var text=result[6];if(text){formattedString+=""+text;}else{var replacement="";switch(conversionCharacter){case"a":case"m":var depth=0;if(specifier){depth=parseInt(specifier,10);if(isNaN(depth)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character '"+conversionCharacter+"' - should be a number");depth=0;}}\r
+var messages=(conversionCharacter==="a")?loggingEvent.messages[0]:loggingEvent.messages;for(var i=0,len=messages.length;i<len;i++){if(i>0&&(replacement.charAt(replacement.length-1)!==" ")){replacement+=" ";}\r
+if(depth===0){replacement+=messages[i];}else{replacement+=formatObjectExpansion(messages[i],depth);}}\r
+break;case"c":var loggerName=loggingEvent.logger.name;if(specifier){var precision=parseInt(specifier,10);var loggerNameBits=loggingEvent.logger.name.split(".");if(precision>=loggerNameBits.length){replacement=loggerName;}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".");}}else{replacement=loggerName;}\r
+break;case"d":var dateFormat=PatternLayout.ISO8601_DATEFORMAT;if(specifier){dateFormat=specifier;if(dateFormat=="ISO8601"){dateFormat=PatternLayout.ISO8601_DATEFORMAT;}else if(dateFormat=="ABSOLUTE"){dateFormat=PatternLayout.ABSOLUTETIME_DATEFORMAT;}else if(dateFormat=="DATE"){dateFormat=PatternLayout.DATETIME_DATEFORMAT;}}\r
+replacement=(new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);break;case"f":if(this.hasCustomFields()){var fieldIndex=0;if(specifier){fieldIndex=parseInt(specifier,10);if(isNaN(fieldIndex)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - should be a number");}else if(fieldIndex===0){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - must be greater than zero");}else if(fieldIndex>this.customFields.length){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - there aren't that many custom fields");}else{fieldIndex=fieldIndex-1;}}\r
+var val=this.customFields[fieldIndex].value;if(typeof val=="function"){val=val(this,loggingEvent);}\r
+replacement=val;}\r
+break;case"n":replacement=newLine;break;case"p":replacement=loggingEvent.level.name;break;case"r":replacement=""+loggingEvent.timeStamp.getDifference(applicationStartDate);break;case"%":replacement="%";break;default:replacement=matchedString;break;}\r
+var l;if(truncation){l=parseInt(truncation.substr(1),10);var strLen=replacement.length;if(l<strLen){replacement=replacement.substring(strLen-l,strLen);}}\r
+if(padding){if(padding.charAt(0)=="-"){l=parseInt(padding.substr(1),10);while(replacement.length<l){replacement+=" ";}}else{l=parseInt(padding,10);while(replacement.length<l){replacement=" "+replacement;}}}\r
+formattedString+=replacement;}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};PatternLayout.prototype.ignoresThrowable=function(){return true;};PatternLayout.prototype.toString=function(){return"PatternLayout";};log4javascript.PatternLayout=PatternLayout;var xmlHttpFactories=[function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];var getXmlHttp=function(errorHandler){var xmlHttp=null,factory;for(var i=0,len=xmlHttpFactories.length;i<len;i++){factory=xmlHttpFactories[i];try{xmlHttp=factory();getXmlHttp=factory;return xmlHttp;}catch(e){}}\r
+if(errorHandler){errorHandler();}else{handleError("getXmlHttp: unable to obtain XMLHttpRequest object");}};function isHttpRequestSuccessful(xmlHttp){return isUndefined(xmlHttp.status)||xmlHttp.status===0||(xmlHttp.status>=200&&xmlHttp.status<300)||xmlHttp.status==1223;}\r
+function AjaxAppender(url){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;}\r
+var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var contentType=this.defaults.contentType;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var headers=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+\r
+configOptionName+"' may not be set after the appender has been initialized");return false;}\r
+return true;}\r
+this.getSessionId=function(){return sessionId;};this.setSessionId=function(sessionIdParam){sessionId=extractStringFromParam(sessionIdParam,null);this.layout.setCustomField("sessionid",sessionId);};this.setLayout=function(layoutParam){if(checkCanConfigure("layout")){this.layout=layoutParam;if(sessionId!==null){this.setSessionId(sessionId);}}};this.isTimed=function(){return timed;};this.setTimed=function(timedParam){if(checkCanConfigure("timed")){timed=bool(timedParam);}};this.getTimerInterval=function(){return timerInterval;};this.setTimerInterval=function(timerIntervalParam){if(checkCanConfigure("timerInterval")){timerInterval=extractIntFromParam(timerIntervalParam,timerInterval);}};this.isWaitForResponse=function(){return waitForResponse;};this.setWaitForResponse=function(waitForResponseParam){if(checkCanConfigure("waitForResponse")){waitForResponse=bool(waitForResponseParam);}};this.getBatchSize=function(){return batchSize;};this.setBatchSize=function(batchSizeParam){if(checkCanConfigure("batchSize")){batchSize=extractIntFromParam(batchSizeParam,batchSize);}};this.isSendAllOnUnload=function(){return sendAllOnUnload;};this.setSendAllOnUnload=function(sendAllOnUnloadParam){if(checkCanConfigure("sendAllOnUnload")){sendAllOnUnload=extractBooleanFromParam(sendAllOnUnloadParam,sendAllOnUnload);}};this.setRequestSuccessCallback=function(requestSuccessCallbackParam){requestSuccessCallback=extractFunctionFromParam(requestSuccessCallbackParam,requestSuccessCallback);};this.setFailCallback=function(failCallbackParam){failCallback=extractFunctionFromParam(failCallbackParam,failCallback);};this.getPostVarName=function(){return postVarName;};this.setPostVarName=function(postVarNameParam){if(checkCanConfigure("postVarName")){postVarName=extractStringFromParam(postVarNameParam,postVarName);}};this.getHeaders=function(){return headers;};this.addHeader=function(name,value){if(name.toLowerCase()=="content-type"){contentType=value;}else{headers.push({name:name,value:value});}};function sendAll(){if(isSupported&&enabled){sending=true;var currentRequestBatch;if(waitForResponse){if(queuedRequests.length>0){currentRequestBatch=queuedRequests.shift();sendRequest(preparePostData(currentRequestBatch),sendAll);}else{sending=false;if(timed){scheduleSending();}}}else{while((currentRequestBatch=queuedRequests.shift())){sendRequest(preparePostData(currentRequestBatch));}\r
+sending=false;if(timed){scheduleSending();}}}}\r
+this.sendAll=sendAll;function sendAllRemaining(){var sendingAnything=false;if(isSupported&&enabled){var actualBatchSize=appender.getLayout().allowBatching()?batchSize:1;var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);if(queuedLoggingEvents.length>=actualBatchSize){queuedRequests.push(batchedLoggingEvents);batchedLoggingEvents=[];}}\r
+if(batchedLoggingEvents.length>0){queuedRequests.push(batchedLoggingEvents);}\r
+sendingAnything=(queuedRequests.length>0);waitForResponse=false;timed=false;sendAll();}\r
+return sendingAnything;}\r
+this.sendAllRemaining=sendAllRemaining;function preparePostData(batchedLoggingEvents){var formattedMessages=[];var currentLoggingEvent;var postData="";while((currentLoggingEvent=batchedLoggingEvents.shift())){var currentFormattedMessage=appender.getLayout().format(currentLoggingEvent);if(appender.getLayout().ignoresThrowable()){currentFormattedMessage+=currentLoggingEvent.getThrowableStrRep();}\r
+formattedMessages.push(currentFormattedMessage);}\r
+if(batchedLoggingEvents.length==1){postData=formattedMessages.join("");}else{postData=appender.getLayout().batchHeader+\r
+formattedMessages.join(appender.getLayout().batchSeparator)+\r
+appender.getLayout().batchFooter;}\r
+if(contentType==appender.defaults.contentType){postData=appender.getLayout().returnsPostData?postData:urlEncode(postVarName)+"="+urlEncode(postData);if(postData.length>0){postData+="&";}\r
+postData+="layout="+urlEncode(appender.getLayout().toString());}\r
+return postData;}\r
+function scheduleSending(){window.setTimeout(sendAll,timerInterval);}\r
+function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}}\r
+function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(xmlHttp.overrideMimeType){xmlHttp.overrideMimeType(appender.getLayout().getContentType());}\r
+xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}\r
+if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+\r
+url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}}\r
+xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}\r
+xmlHttp.setRequestHeader("Content-Type",contentType);}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}\r
+return;}\r
+xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}}\r
+this.append=function(loggingEvent){if(isSupported){if(!initialized){init();}\r
+queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}\r
+queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}\r
+if(sendAllRemaining()){return"Sending log messages";}};}\r
+if(timed){scheduleSending();}}}\r
+AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;log4javascript.setDocumentReady=function(){pageLoaded=true;log4javascript.dispatchEvent("load",{});};if(window.addEventListener){window.addEventListener("load",log4javascript.setDocumentReady,false);}else if(window.attachEvent){window.attachEvent("onload",log4javascript.setDocumentReady);}else{var oldOnload=window.onload;if(typeof window.onload!="function"){window.onload=log4javascript.setDocumentReady;}else{window.onload=function(evt){if(oldOnload){oldOnload(evt);}\r
+log4javascript.setDocumentReady();};}}\r
+window.log4javascript=log4javascript;return log4javascript;})();\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_production_uncompressed.js
new file mode 100644 (file)
index 0000000..1a29621
--- /dev/null
@@ -0,0 +1,2290 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+/**\r
+ * log4javascript\r
+ *\r
+ * log4javascript is a logging framework for JavaScript based on log4j\r
+ * for Java. This file contains all core log4javascript code and is the only\r
+ * file required to use log4javascript, unless you require support for\r
+ * document.domain, in which case you will also need console.html, which must be\r
+ * stored in the same directory as the main log4javascript.js file.\r
+ *\r
+ * Author: Tim Down <tim@log4javascript.org>\r
+ * Version: 1.4.6\r
+ * Edition: log4javascript_production\r
+ * Build date: 19 March 2013\r
+ * Website: http://log4javascript.org\r
+ */\r
+\r
+/* -------------------------------------------------------------------------- */\r
+// Array-related stuff\r
+\r
+// Next three methods are solely for IE5, which is missing them\r
+if (!Array.prototype.push) {\r
+       Array.prototype.push = function() {\r
+               for (var i = 0, len = arguments.length; i < len; i++){\r
+                       this[this.length] = arguments[i];\r
+               }\r
+               return this.length;\r
+       };\r
+}\r
+\r
+if (!Array.prototype.shift) {\r
+       Array.prototype.shift = function() {\r
+               if (this.length > 0) {\r
+                       var firstItem = this[0];\r
+                       for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                               this[i] = this[i + 1];\r
+                       }\r
+                       this.length = this.length - 1;\r
+                       return firstItem;\r
+               }\r
+       };\r
+}\r
+\r
+if (!Array.prototype.splice) {\r
+       Array.prototype.splice = function(startIndex, deleteCount) {\r
+               var itemsAfterDeleted = this.slice(startIndex + deleteCount);\r
+               var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);\r
+               this.length = startIndex;\r
+               // Copy the arguments into a proper Array object\r
+               var argumentsArray = [];\r
+               for (var i = 0, len = arguments.length; i < len; i++) {\r
+                       argumentsArray[i] = arguments[i];\r
+               }\r
+               var itemsToAppend = (argumentsArray.length > 2) ?\r
+                       itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;\r
+               for (i = 0, len = itemsToAppend.length; i < len; i++) {\r
+                       this.push(itemsToAppend[i]);\r
+               }\r
+               return itemsDeleted;\r
+       };\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+var log4javascript = (function() {\r
+\r
+       function isUndefined(obj) {\r
+               return typeof obj == "undefined";\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Custom event support\r
+\r
+       function EventSupport() {}\r
+\r
+       EventSupport.prototype = {\r
+               eventTypes: [],\r
+               eventListeners: {},\r
+               setEventTypes: function(eventTypesParam) {\r
+                       if (eventTypesParam instanceof Array) {\r
+                               this.eventTypes = eventTypesParam;\r
+                               this.eventListeners = {};\r
+                               for (var i = 0, len = this.eventTypes.length; i < len; i++) {\r
+                                       this.eventListeners[this.eventTypes[i]] = [];\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: setEventTypes: eventTypes parameter must be an Array");\r
+                       }\r
+               },\r
+\r
+               addEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: addEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               this.eventListeners[eventType].push(listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: addEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               removeEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               array_remove(this.eventListeners[eventType], listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               dispatchEvent: function(eventType, eventArgs) {\r
+                       if (array_contains(this.eventTypes, eventType)) {\r
+                               var listeners = this.eventListeners[eventType];\r
+                               for (var i = 0, len = listeners.length; i < len; i++) {\r
+                                       listeners[i](this, eventType, eventArgs);\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: dispatchEvent: no event called '" + eventType + "'");\r
+                       }\r
+               }\r
+       };\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+\r
+       var applicationStartDate = new Date();\r
+       var uniqueId = "log4javascript_" + applicationStartDate.getTime() + "_" +\r
+               Math.floor(Math.random() * 100000000);\r
+       var emptyFunction = function() {};\r
+       var newLine = "\r\n";\r
+       var pageLoaded = false;\r
+\r
+       // Create main log4javascript object; this will be assigned public properties\r
+       function Log4JavaScript() {}\r
+       Log4JavaScript.prototype = new EventSupport();\r
+\r
+       log4javascript = new Log4JavaScript();\r
+       log4javascript.version = "1.4.6";\r
+       log4javascript.edition = "log4javascript_production";\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+       // Utility functions\r
+\r
+       function toStr(obj) {\r
+               if (obj && obj.toString) {\r
+                       return obj.toString();\r
+               } else {\r
+                       return String(obj);\r
+               }\r
+       }\r
+\r
+       function getExceptionMessage(ex) {\r
+               if (ex.message) {\r
+                       return ex.message;\r
+               } else if (ex.description) {\r
+                       return ex.description;\r
+               } else {\r
+                       return toStr(ex);\r
+               }\r
+       }\r
+\r
+       // Gets the portion of the URL after the last slash\r
+       function getUrlFileName(url) {\r
+               var lastSlashIndex = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));\r
+               return url.substr(lastSlashIndex + 1);\r
+       }\r
+\r
+       // Returns a nicely formatted representation of an error\r
+       function getExceptionStringRep(ex) {\r
+               if (ex) {\r
+                       var exStr = "Exception: " + getExceptionMessage(ex);\r
+                       try {\r
+                               if (ex.lineNumber) {\r
+                                       exStr += " on line number " + ex.lineNumber;\r
+                               }\r
+                               if (ex.fileName) {\r
+                                       exStr += " in file " + getUrlFileName(ex.fileName);\r
+                               }\r
+                       } catch (localEx) {\r
+                               logLog.warn("Unable to obtain file and line information for error");\r
+                       }\r
+                       if (showStackTraces && ex.stack) {\r
+                               exStr += newLine + "Stack trace:" + newLine + ex.stack;\r
+                       }\r
+                       return exStr;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       function bool(obj) {\r
+               return Boolean(obj);\r
+       }\r
+\r
+       function trim(str) {\r
+               return str.replace(/^\s+/, "").replace(/\s+$/, "");\r
+       }\r
+\r
+       function splitIntoLines(text) {\r
+               // Ensure all line breaks are \n only\r
+               var text2 = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");\r
+               return text2.split("\n");\r
+       }\r
+\r
+       var urlEncode = (typeof window.encodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return encodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");\r
+               };\r
+\r
+       var urlDecode = (typeof window.decodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return decodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");\r
+               };\r
+\r
+       function array_remove(arr, val) {\r
+               var index = -1;\r
+               for (var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] === val) {\r
+                               index = i;\r
+                               break;\r
+                       }\r
+               }\r
+               if (index >= 0) {\r
+                       arr.splice(index, 1);\r
+                       return true;\r
+               } else {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       function array_contains(arr, val) {\r
+               for(var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] == val) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+       function extractBooleanFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return bool(param);\r
+               }\r
+       }\r
+\r
+       function extractStringFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return String(param);\r
+               }\r
+       }\r
+\r
+       function extractIntFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       try {\r
+                               var value = parseInt(param, 10);\r
+                               return isNaN(value) ? defaultValue : value;\r
+                       } catch (ex) {\r
+                               logLog.warn("Invalid int param " + param, ex);\r
+                               return defaultValue;\r
+                       }\r
+               }\r
+       }\r
+\r
+       function extractFunctionFromParam(param, defaultValue) {\r
+               if (typeof param == "function") {\r
+                       return param;\r
+               } else {\r
+                       return defaultValue;\r
+               }\r
+       }\r
+\r
+       function isError(err) {\r
+               return (err instanceof Error);\r
+       }\r
+\r
+       if (!Function.prototype.apply){\r
+               Function.prototype.apply = function(obj, args) {\r
+                       var methodName = "__apply__";\r
+                       if (typeof obj[methodName] != "undefined") {\r
+                               methodName += String(Math.random()).substr(2);\r
+                       }\r
+                       obj[methodName] = this;\r
+\r
+                       var argsStrings = [];\r
+                       for (var i = 0, len = args.length; i < len; i++) {\r
+                               argsStrings[i] = "args[" + i + "]";\r
+                       }\r
+                       var script = "obj." + methodName + "(" + argsStrings.join(",") + ")";\r
+                       var returnValue = eval(script);\r
+                       delete obj[methodName];\r
+                       return returnValue;\r
+               };\r
+       }\r
+\r
+       if (!Function.prototype.call){\r
+               Function.prototype.call = function(obj) {\r
+                       var args = [];\r
+                       for (var i = 1, len = arguments.length; i < len; i++) {\r
+                               args[i - 1] = arguments[i];\r
+                       }\r
+                       return this.apply(obj, args);\r
+               };\r
+       }\r
+\r
+       function getListenersPropertyName(eventName) {\r
+               return "__log4javascript_listeners__" + eventName;\r
+       }\r
+\r
+       function addEvent(node, eventName, listener, useCapture, win) {\r
+               win = win ? win : window;\r
+               if (node.addEventListener) {\r
+                       node.addEventListener(eventName, listener, useCapture);\r
+               } else if (node.attachEvent) {\r
+                       node.attachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (!node[propertyName]) {\r
+                               node[propertyName] = [];\r
+                               // Set event handler\r
+                               node["on" + eventName] = function(evt) {\r
+                                       evt = getEvent(evt, win);\r
+                                       var listenersPropertyName = getListenersPropertyName(eventName);\r
+\r
+                                       // Clone the array of listeners to leave the original untouched\r
+                                       var listeners = this[listenersPropertyName].concat([]);\r
+                                       var currentListener;\r
+\r
+                                       // Call each listener in turn\r
+                                       while ((currentListener = listeners.shift())) {\r
+                                               currentListener.call(this, evt);\r
+                                       }\r
+                               };\r
+                       }\r
+                       node[propertyName].push(listener);\r
+               }\r
+       }\r
+\r
+       function removeEvent(node, eventName, listener, useCapture) {\r
+               if (node.removeEventListener) {\r
+                       node.removeEventListener(eventName, listener, useCapture);\r
+               } else if (node.detachEvent) {\r
+                       node.detachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (node[propertyName]) {\r
+                               array_remove(node[propertyName], listener);\r
+                       }\r
+               }\r
+       }\r
+\r
+       function getEvent(evt, win) {\r
+               win = win ? win : window;\r
+               return evt ? evt : win.event;\r
+       }\r
+\r
+       function stopEventPropagation(evt) {\r
+               if (evt.stopPropagation) {\r
+                       evt.stopPropagation();\r
+               } else if (typeof evt.cancelBubble != "undefined") {\r
+                       evt.cancelBubble = true;\r
+               }\r
+               evt.returnValue = false;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Simple logging for log4javascript itself\r
+\r
+       var logLog = {\r
+               quietMode: false,\r
+\r
+               debugMessages: [],\r
+\r
+               setQuietMode: function(quietMode) {\r
+                       this.quietMode = bool(quietMode);\r
+               },\r
+\r
+               numberOfErrors: 0,\r
+\r
+               alertAllErrors: false,\r
+\r
+               setAlertAllErrors: function(alertAllErrors) {\r
+                       this.alertAllErrors = alertAllErrors;\r
+               },\r
+\r
+               debug: function(message) {\r
+                       this.debugMessages.push(message);\r
+               },\r
+\r
+               displayDebug: function() {\r
+                       alert(this.debugMessages.join(newLine));\r
+               },\r
+\r
+               warn: function(message, exception) {\r
+               },\r
+\r
+               error: function(message, exception) {\r
+                       if (++this.numberOfErrors == 1 || this.alertAllErrors) {\r
+                               if (!this.quietMode) {\r
+                                       var alertMessage = "log4javascript error: " + message;\r
+                                       if (exception) {\r
+                                               alertMessage += newLine + newLine + "Original error: " + getExceptionStringRep(exception);\r
+                                       }\r
+                                       alert(alertMessage);\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+       log4javascript.logLog = logLog;\r
+\r
+       log4javascript.setEventTypes(["load", "error"]);\r
+\r
+       function handleError(message, exception) {\r
+               logLog.error(message, exception);\r
+               log4javascript.dispatchEvent("error", { "message": message, "exception": exception });\r
+       }\r
+\r
+       log4javascript.handleError = handleError;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+\r
+       var enabled = !((typeof log4javascript_disabled != "undefined") &&\r
+                                       log4javascript_disabled);\r
+\r
+       log4javascript.setEnabled = function(enable) {\r
+               enabled = bool(enable);\r
+       };\r
+\r
+       log4javascript.isEnabled = function() {\r
+               return enabled;\r
+       };\r
+\r
+       var useTimeStampsInMilliseconds = true;\r
+\r
+       log4javascript.setTimeStampsInMilliseconds = function(timeStampsInMilliseconds) {\r
+               useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+       };\r
+\r
+       log4javascript.isTimeStampsInMilliseconds = function() {\r
+               return useTimeStampsInMilliseconds;\r
+       };\r
+       \r
+\r
+       // This evaluates the given expression in the current scope, thus allowing\r
+       // scripts to access private variables. Particularly useful for testing\r
+       log4javascript.evalInScope = function(expr) {\r
+               return eval(expr);\r
+       };\r
+\r
+       var showStackTraces = false;\r
+\r
+       log4javascript.setShowStackTraces = function(show) {\r
+               showStackTraces = bool(show);\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Levels\r
+\r
+       var Level = function(level, name) {\r
+               this.level = level;\r
+               this.name = name;\r
+       };\r
+\r
+       Level.prototype = {\r
+               toString: function() {\r
+                       return this.name;\r
+               },\r
+               equals: function(level) {\r
+                       return this.level == level.level;\r
+               },\r
+               isGreaterOrEqual: function(level) {\r
+                       return this.level >= level.level;\r
+               }\r
+       };\r
+\r
+       Level.ALL = new Level(Number.MIN_VALUE, "ALL");\r
+       Level.TRACE = new Level(10000, "TRACE");\r
+       Level.DEBUG = new Level(20000, "DEBUG");\r
+       Level.INFO = new Level(30000, "INFO");\r
+       Level.WARN = new Level(40000, "WARN");\r
+       Level.ERROR = new Level(50000, "ERROR");\r
+       Level.FATAL = new Level(60000, "FATAL");\r
+       Level.OFF = new Level(Number.MAX_VALUE, "OFF");\r
+\r
+       log4javascript.Level = Level;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Timers\r
+\r
+       function Timer(name, level) {\r
+               this.name = name;\r
+               this.level = isUndefined(level) ? Level.INFO : level;\r
+               this.start = new Date();\r
+       }\r
+\r
+       Timer.prototype.getElapsedTime = function() {\r
+               return new Date().getTime() - this.start.getTime();\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Loggers\r
+\r
+       var anonymousLoggerName = "[anonymous]";\r
+       var defaultLoggerName = "[default]";\r
+       var nullLoggerName = "[null]";\r
+       var rootLoggerName = "root";\r
+\r
+       function Logger(name) {\r
+               this.name = name;\r
+               this.parent = null;\r
+               this.children = [];\r
+\r
+               var appenders = [];\r
+               var loggerLevel = null;\r
+               var isRoot = (this.name === rootLoggerName);\r
+               var isNull = (this.name === nullLoggerName);\r
+\r
+               var appenderCache = null;\r
+               var appenderCacheInvalidated = false;\r
+               \r
+               this.addChild = function(childLogger) {\r
+                       this.children.push(childLogger);\r
+                       childLogger.parent = this;\r
+                       childLogger.invalidateAppenderCache();\r
+               };\r
+\r
+               // Additivity\r
+               var additive = true;\r
+               this.getAdditivity = function() {\r
+                       return additive;\r
+               };\r
+\r
+               this.setAdditivity = function(additivity) {\r
+                       var valueChanged = (additive != additivity);\r
+                       additive = additivity;\r
+                       if (valueChanged) {\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               // Create methods that use the appenders variable in this scope\r
+               this.addAppender = function(appender) {\r
+                       if (isNull) {\r
+                               handleError("Logger.addAppender: you may not add an appender to the null logger");\r
+                       } else {\r
+                               if (appender instanceof log4javascript.Appender) {\r
+                                       if (!array_contains(appenders, appender)) {\r
+                                               appenders.push(appender);\r
+                                               appender.setAddedToLogger(this);\r
+                                               this.invalidateAppenderCache();\r
+                                       }\r
+                               } else {\r
+                                       handleError("Logger.addAppender: appender supplied ('" +\r
+                                               toStr(appender) + "') is not a subclass of Appender");\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.removeAppender = function(appender) {\r
+                       array_remove(appenders, appender);\r
+                       appender.setRemovedFromLogger(this);\r
+                       this.invalidateAppenderCache();\r
+               };\r
+\r
+               this.removeAllAppenders = function() {\r
+                       var appenderCount = appenders.length;\r
+                       if (appenderCount > 0) {\r
+                               for (var i = 0; i < appenderCount; i++) {\r
+                                       appenders[i].setRemovedFromLogger(this);\r
+                               }\r
+                               appenders.length = 0;\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.getEffectiveAppenders = function() {\r
+                       if (appenderCache === null || appenderCacheInvalidated) {\r
+                               // Build appender cache\r
+                               var parentEffectiveAppenders = (isRoot || !this.getAdditivity()) ?\r
+                                       [] : this.parent.getEffectiveAppenders();\r
+                               appenderCache = parentEffectiveAppenders.concat(appenders);\r
+                               appenderCacheInvalidated = false;\r
+                       }\r
+                       return appenderCache;\r
+               };\r
+               \r
+               this.invalidateAppenderCache = function() {\r
+                       appenderCacheInvalidated = true;\r
+                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                               this.children[i].invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.log = function(level, params) {\r
+                       if (enabled && level.isGreaterOrEqual(this.getEffectiveLevel())) {\r
+                               // Check whether last param is an exception\r
+                               var exception;\r
+                               var finalParamIndex = params.length - 1;\r
+                               var lastParam = params[finalParamIndex];\r
+                               if (params.length > 1 && isError(lastParam)) {\r
+                                       exception = lastParam;\r
+                                       finalParamIndex--;\r
+                               }\r
+\r
+                               // Construct genuine array for the params\r
+                               var messages = [];\r
+                               for (var i = 0; i <= finalParamIndex; i++) {\r
+                                       messages[i] = params[i];\r
+                               }\r
+\r
+                               var loggingEvent = new LoggingEvent(\r
+                                       this, new Date(), level, messages, exception);\r
+\r
+                               this.callAppenders(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.callAppenders = function(loggingEvent) {\r
+                       var effectiveAppenders = this.getEffectiveAppenders();\r
+                       for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                               effectiveAppenders[i].doAppend(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.setLevel = function(level) {\r
+                       // Having a level of null on the root logger would be very bad.\r
+                       if (isRoot && level === null) {\r
+                               handleError("Logger.setLevel: you cannot set the level of the root logger to null");\r
+                       } else if (level instanceof Level) {\r
+                               loggerLevel = level;\r
+                       } else {\r
+                               handleError("Logger.setLevel: level supplied to logger " +\r
+                                       this.name + " is not an instance of log4javascript.Level");\r
+                       }\r
+               };\r
+\r
+               this.getLevel = function() {\r
+                       return loggerLevel;\r
+               };\r
+\r
+               this.getEffectiveLevel = function() {\r
+                       for (var logger = this; logger !== null; logger = logger.parent) {\r
+                               var level = logger.getLevel();\r
+                               if (level !== null) {\r
+                                       return level;\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.group = function(name, initiallyExpanded) {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].group(name, initiallyExpanded);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.groupEnd = function() {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].groupEnd();\r
+                               }\r
+                       }\r
+               };\r
+\r
+               var timers = {};\r
+\r
+               this.time = function(name, level) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.time: a name for the timer must be supplied");\r
+                               } else if (level && !(level instanceof Level)) {\r
+                                       handleError("Logger.time: level supplied to timer " +\r
+                                               name + " is not an instance of log4javascript.Level");\r
+                               } else {\r
+                                       timers[name] = new Timer(name, level);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.timeEnd = function(name) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.timeEnd: a name for the timer must be supplied");\r
+                               } else if (timers[name]) {\r
+                                       var timer = timers[name];\r
+                                       var milliseconds = timer.getElapsedTime();\r
+                                       this.log(timer.level, ["Timer " + toStr(name) + " completed in " + milliseconds + "ms"]);\r
+                                       delete timers[name];\r
+                               } else {\r
+                                       logLog.warn("Logger.timeEnd: no timer found with name " + name);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.assert = function(expr) {\r
+                       if (enabled && !expr) {\r
+                               var args = [];\r
+                               for (var i = 1, len = arguments.length; i < len; i++) {\r
+                                       args.push(arguments[i]);\r
+                               }\r
+                               args = (args.length > 0) ? args : ["Assertion Failure"];\r
+                               args.push(newLine);\r
+                               args.push(expr);\r
+                               this.log(Level.ERROR, args);\r
+                       }\r
+               };\r
+\r
+               this.toString = function() {\r
+                       return "Logger[" + this.name + "]";\r
+               };\r
+       }\r
+\r
+       Logger.prototype = {\r
+               trace: function() {\r
+                       this.log(Level.TRACE, arguments);\r
+               },\r
+\r
+               debug: function() {\r
+                       this.log(Level.DEBUG, arguments);\r
+               },\r
+\r
+               info: function() {\r
+                       this.log(Level.INFO, arguments);\r
+               },\r
+\r
+               warn: function() {\r
+                       this.log(Level.WARN, arguments);\r
+               },\r
+\r
+               error: function() {\r
+                       this.log(Level.ERROR, arguments);\r
+               },\r
+\r
+               fatal: function() {\r
+                       this.log(Level.FATAL, arguments);\r
+               },\r
+\r
+               isEnabledFor: function(level) {\r
+                       return level.isGreaterOrEqual(this.getEffectiveLevel());\r
+               },\r
+\r
+               isTraceEnabled: function() {\r
+                       return this.isEnabledFor(Level.TRACE);\r
+               },\r
+\r
+               isDebugEnabled: function() {\r
+                       return this.isEnabledFor(Level.DEBUG);\r
+               },\r
+\r
+               isInfoEnabled: function() {\r
+                       return this.isEnabledFor(Level.INFO);\r
+               },\r
+\r
+               isWarnEnabled: function() {\r
+                       return this.isEnabledFor(Level.WARN);\r
+               },\r
+\r
+               isErrorEnabled: function() {\r
+                       return this.isEnabledFor(Level.ERROR);\r
+               },\r
+\r
+               isFatalEnabled: function() {\r
+                       return this.isEnabledFor(Level.FATAL);\r
+               }\r
+       };\r
+\r
+       Logger.prototype.trace.isEntryPoint = true;\r
+       Logger.prototype.debug.isEntryPoint = true;\r
+       Logger.prototype.info.isEntryPoint = true;\r
+       Logger.prototype.warn.isEntryPoint = true;\r
+       Logger.prototype.error.isEntryPoint = true;\r
+       Logger.prototype.fatal.isEntryPoint = true;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logger access methods\r
+\r
+       // Hashtable of loggers keyed by logger name\r
+       var loggers = {};\r
+       var loggerNames = [];\r
+\r
+       var ROOT_LOGGER_DEFAULT_LEVEL = Level.DEBUG;\r
+       var rootLogger = new Logger(rootLoggerName);\r
+       rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+\r
+       log4javascript.getRootLogger = function() {\r
+               return rootLogger;\r
+       };\r
+\r
+       log4javascript.getLogger = function(loggerName) {\r
+               // Use default logger if loggerName is not specified or invalid\r
+               if (!(typeof loggerName == "string")) {\r
+                       loggerName = anonymousLoggerName;\r
+                       logLog.warn("log4javascript.getLogger: non-string logger name " +\r
+                               toStr(loggerName) + " supplied, returning anonymous logger");\r
+               }\r
+\r
+               // Do not allow retrieval of the root logger by name\r
+               if (loggerName == rootLoggerName) {\r
+                       handleError("log4javascript.getLogger: root logger may not be obtained by name");\r
+               }\r
+\r
+               // Create the logger for this name if it doesn't already exist\r
+               if (!loggers[loggerName]) {\r
+                       var logger = new Logger(loggerName);\r
+                       loggers[loggerName] = logger;\r
+                       loggerNames.push(loggerName);\r
+\r
+                       // Set up parent logger, if it doesn't exist\r
+                       var lastDotIndex = loggerName.lastIndexOf(".");\r
+                       var parentLogger;\r
+                       if (lastDotIndex > -1) {\r
+                               var parentLoggerName = loggerName.substring(0, lastDotIndex);\r
+                               parentLogger = log4javascript.getLogger(parentLoggerName); // Recursively sets up grandparents etc.\r
+                       } else {\r
+                               parentLogger = rootLogger;\r
+                       }\r
+                       parentLogger.addChild(logger);\r
+               }\r
+               return loggers[loggerName];\r
+       };\r
+\r
+       var defaultLogger = null;\r
+       log4javascript.getDefaultLogger = function() {\r
+               if (!defaultLogger) {\r
+                       defaultLogger = log4javascript.getLogger(defaultLoggerName);\r
+                       var a = new log4javascript.PopUpAppender();\r
+                       defaultLogger.addAppender(a);\r
+               }\r
+               return defaultLogger;\r
+       };\r
+\r
+       var nullLogger = null;\r
+       log4javascript.getNullLogger = function() {\r
+               if (!nullLogger) {\r
+                       nullLogger = new Logger(nullLoggerName);\r
+                       nullLogger.setLevel(Level.OFF);\r
+               }\r
+               return nullLogger;\r
+       };\r
+\r
+       // Destroys all loggers\r
+       log4javascript.resetConfiguration = function() {\r
+               rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+               loggers = {};\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logging events\r
+\r
+       var LoggingEvent = function(logger, timeStamp, level, messages,\r
+                       exception) {\r
+               this.logger = logger;\r
+               this.timeStamp = timeStamp;\r
+               this.timeStampInMilliseconds = timeStamp.getTime();\r
+               this.timeStampInSeconds = Math.floor(this.timeStampInMilliseconds / 1000);\r
+               this.milliseconds = this.timeStamp.getMilliseconds();\r
+               this.level = level;\r
+               this.messages = messages;\r
+               this.exception = exception;\r
+       };\r
+\r
+       LoggingEvent.prototype = {\r
+               getThrowableStrRep: function() {\r
+                       return this.exception ?\r
+                               getExceptionStringRep(this.exception) : "";\r
+               },\r
+               getCombinedMessages: function() {\r
+                       return (this.messages.length == 1) ? this.messages[0] :\r
+                                  this.messages.join(newLine);\r
+               },\r
+               toString: function() {\r
+                       return "LoggingEvent[" + this.level + "]";\r
+               }\r
+       };\r
+\r
+       log4javascript.LoggingEvent = LoggingEvent;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Layout prototype\r
+\r
+       var Layout = function() {\r
+       };\r
+\r
+       Layout.prototype = {\r
+               defaults: {\r
+                       loggerKey: "logger",\r
+                       timeStampKey: "timestamp",\r
+                       millisecondsKey: "milliseconds",\r
+                       levelKey: "level",\r
+                       messageKey: "message",\r
+                       exceptionKey: "exception",\r
+                       urlKey: "url"\r
+               },\r
+               loggerKey: "logger",\r
+               timeStampKey: "timestamp",\r
+               millisecondsKey: "milliseconds",\r
+               levelKey: "level",\r
+               messageKey: "message",\r
+               exceptionKey: "exception",\r
+               urlKey: "url",\r
+               batchHeader: "",\r
+               batchFooter: "",\r
+               batchSeparator: "",\r
+               returnsPostData: false,\r
+               overrideTimeStampsSetting: false,\r
+               useTimeStampsInMilliseconds: null,\r
+\r
+               format: function() {\r
+                       handleError("Layout.format: layout supplied has no format() method");\r
+               },\r
+\r
+               ignoresThrowable: function() {\r
+                       handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");\r
+               },\r
+\r
+               getContentType: function() {\r
+                       return "text/plain";\r
+               },\r
+\r
+               allowBatching: function() {\r
+                       return true;\r
+               },\r
+\r
+               setTimeStampsInMilliseconds: function(timeStampsInMilliseconds) {\r
+                       this.overrideTimeStampsSetting = true;\r
+                       this.useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+               },\r
+\r
+               isTimeStampsInMilliseconds: function() {\r
+                       return this.overrideTimeStampsSetting ?\r
+                               this.useTimeStampsInMilliseconds : useTimeStampsInMilliseconds;\r
+               },\r
+\r
+               getTimeStampValue: function(loggingEvent) {\r
+                       return this.isTimeStampsInMilliseconds() ?\r
+                               loggingEvent.timeStampInMilliseconds : loggingEvent.timeStampInSeconds;\r
+               },\r
+\r
+               getDataValues: function(loggingEvent, combineMessages) {\r
+                       var dataValues = [\r
+                               [this.loggerKey, loggingEvent.logger.name],\r
+                               [this.timeStampKey, this.getTimeStampValue(loggingEvent)],\r
+                               [this.levelKey, loggingEvent.level.name],\r
+                               [this.urlKey, window.location.href],\r
+                               [this.messageKey, combineMessages ? loggingEvent.getCombinedMessages() : loggingEvent.messages]\r
+                       ];\r
+                       if (!this.isTimeStampsInMilliseconds()) {\r
+                               dataValues.push([this.millisecondsKey, loggingEvent.milliseconds]);\r
+                       }\r
+                       if (loggingEvent.exception) {\r
+                               dataValues.push([this.exceptionKey, getExceptionStringRep(loggingEvent.exception)]);\r
+                       }\r
+                       if (this.hasCustomFields()) {\r
+                               for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                                       var val = this.customFields[i].value;\r
+\r
+                                       // Check if the value is a function. If so, execute it, passing it the\r
+                                       // current layout and the logging event\r
+                                       if (typeof val === "function") {\r
+                                               val = val(this, loggingEvent);\r
+                                       }\r
+                                       dataValues.push([this.customFields[i].name, val]);\r
+                               }\r
+                       }\r
+                       return dataValues;\r
+               },\r
+\r
+               setKeys: function(loggerKey, timeStampKey, levelKey, messageKey,\r
+                               exceptionKey, urlKey, millisecondsKey) {\r
+                       this.loggerKey = extractStringFromParam(loggerKey, this.defaults.loggerKey);\r
+                       this.timeStampKey = extractStringFromParam(timeStampKey, this.defaults.timeStampKey);\r
+                       this.levelKey = extractStringFromParam(levelKey, this.defaults.levelKey);\r
+                       this.messageKey = extractStringFromParam(messageKey, this.defaults.messageKey);\r
+                       this.exceptionKey = extractStringFromParam(exceptionKey, this.defaults.exceptionKey);\r
+                       this.urlKey = extractStringFromParam(urlKey, this.defaults.urlKey);\r
+                       this.millisecondsKey = extractStringFromParam(millisecondsKey, this.defaults.millisecondsKey);\r
+               },\r
+\r
+               setCustomField: function(name, value) {\r
+                       var fieldUpdated = false;\r
+                       for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                               if (this.customFields[i].name === name) {\r
+                                       this.customFields[i].value = value;\r
+                                       fieldUpdated = true;\r
+                               }\r
+                       }\r
+                       if (!fieldUpdated) {\r
+                               this.customFields.push({"name": name, "value": value});\r
+                       }\r
+               },\r
+\r
+               hasCustomFields: function() {\r
+                       return (this.customFields.length > 0);\r
+               },\r
+\r
+               toString: function() {\r
+                       handleError("Layout.toString: all layouts must override this method");\r
+               }\r
+       };\r
+\r
+       log4javascript.Layout = Layout;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Appender prototype\r
+\r
+       var Appender = function() {};\r
+\r
+       Appender.prototype = new EventSupport();\r
+\r
+       Appender.prototype.layout = new PatternLayout();\r
+       Appender.prototype.threshold = Level.ALL;\r
+       Appender.prototype.loggers = [];\r
+\r
+       // Performs threshold checks before delegating actual logging to the\r
+       // subclass's specific append method.\r
+       Appender.prototype.doAppend = function(loggingEvent) {\r
+               if (enabled && loggingEvent.level.level >= this.threshold.level) {\r
+                       this.append(loggingEvent);\r
+               }\r
+       };\r
+\r
+       Appender.prototype.append = function(loggingEvent) {};\r
+\r
+       Appender.prototype.setLayout = function(layout) {\r
+               if (layout instanceof Layout) {\r
+                       this.layout = layout;\r
+               } else {\r
+                       handleError("Appender.setLayout: layout supplied to " +\r
+                               this.toString() + " is not a subclass of Layout");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getLayout = function() {\r
+               return this.layout;\r
+       };\r
+\r
+       Appender.prototype.setThreshold = function(threshold) {\r
+               if (threshold instanceof Level) {\r
+                       this.threshold = threshold;\r
+               } else {\r
+                       handleError("Appender.setThreshold: threshold supplied to " +\r
+                               this.toString() + " is not a subclass of Level");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getThreshold = function() {\r
+               return this.threshold;\r
+       };\r
+\r
+       Appender.prototype.setAddedToLogger = function(logger) {\r
+               this.loggers.push(logger);\r
+       };\r
+\r
+       Appender.prototype.setRemovedFromLogger = function(logger) {\r
+               array_remove(this.loggers, logger);\r
+       };\r
+\r
+       Appender.prototype.group = emptyFunction;\r
+       Appender.prototype.groupEnd = emptyFunction;\r
+\r
+       Appender.prototype.toString = function() {\r
+               handleError("Appender.toString: all appenders must override this method");\r
+       };\r
+\r
+       log4javascript.Appender = Appender;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // SimpleLayout \r
+\r
+       function SimpleLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       SimpleLayout.prototype = new Layout();\r
+\r
+       SimpleLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.level.name + " - " + loggingEvent.getCombinedMessages();\r
+       };\r
+\r
+       SimpleLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       SimpleLayout.prototype.toString = function() {\r
+           return "SimpleLayout";\r
+       };\r
+\r
+       log4javascript.SimpleLayout = SimpleLayout;\r
+       /* ----------------------------------------------------------------------- */\r
+       // NullLayout \r
+\r
+       function NullLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       NullLayout.prototype = new Layout();\r
+\r
+       NullLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.messages;\r
+       };\r
+\r
+       NullLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       NullLayout.prototype.toString = function() {\r
+           return "NullLayout";\r
+       };\r
+\r
+       log4javascript.NullLayout = NullLayout;\r
+/* ---------------------------------------------------------------------- */\r
+       // XmlLayout\r
+\r
+       function XmlLayout(combineMessages) {\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.customFields = [];\r
+       }\r
+\r
+       XmlLayout.prototype = new Layout();\r
+\r
+       XmlLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+       XmlLayout.prototype.getContentType = function() {\r
+               return "text/xml";\r
+       };\r
+\r
+       XmlLayout.prototype.escapeCdata = function(str) {\r
+               return str.replace(/\]\]>/, "]]>]]&gt;<![CDATA[");\r
+       };\r
+\r
+       XmlLayout.prototype.format = function(loggingEvent) {\r
+               var layout = this;\r
+               var i, len;\r
+               function formatMessage(message) {\r
+                       message = (typeof message === "string") ? message : toStr(message);\r
+                       return "<log4javascript:message><![CDATA[" +\r
+                               layout.escapeCdata(message) + "]]></log4javascript:message>";\r
+               }\r
+\r
+               var str = "<log4javascript:event logger=\"" + loggingEvent.logger.name +\r
+                       "\" timestamp=\"" + this.getTimeStampValue(loggingEvent) + "\"";\r
+               if (!this.isTimeStampsInMilliseconds()) {\r
+                       str += " milliseconds=\"" + loggingEvent.milliseconds + "\"";\r
+               }\r
+               str += " level=\"" + loggingEvent.level.name + "\">" + newLine;\r
+               if (this.combineMessages) {\r
+                       str += formatMessage(loggingEvent.getCombinedMessages());\r
+               } else {\r
+                       str += "<log4javascript:messages>" + newLine;\r
+                       for (i = 0, len = loggingEvent.messages.length; i < len; i++) {\r
+                               str += formatMessage(loggingEvent.messages[i]) + newLine;\r
+                       }\r
+                       str += "</log4javascript:messages>" + newLine;\r
+               }\r
+               if (this.hasCustomFields()) {\r
+                       for (i = 0, len = this.customFields.length; i < len; i++) {\r
+                               str += "<log4javascript:customfield name=\"" +\r
+                                       this.customFields[i].name + "\"><![CDATA[" +\r
+                                       this.customFields[i].value.toString() +\r
+                                       "]]></log4javascript:customfield>" + newLine;\r
+                       }\r
+               }\r
+               if (loggingEvent.exception) {\r
+                       str += "<log4javascript:exception><![CDATA[" +\r
+                               getExceptionStringRep(loggingEvent.exception) +\r
+                               "]]></log4javascript:exception>" + newLine;\r
+               }\r
+               str += "</log4javascript:event>" + newLine + newLine;\r
+               return str;\r
+       };\r
+\r
+       XmlLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       XmlLayout.prototype.toString = function() {\r
+           return "XmlLayout";\r
+       };\r
+\r
+       log4javascript.XmlLayout = XmlLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout related\r
+\r
+       function escapeNewLines(str) {\r
+               return str.replace(/\r\n|\r|\n/g, "\\r\\n");\r
+       }\r
+\r
+       function JsonLayout(readable, combineMessages) {\r
+               this.readable = extractBooleanFromParam(readable, false);\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.batchHeader = this.readable ? "[" + newLine : "[";\r
+               this.batchFooter = this.readable ? "]" + newLine : "]";\r
+               this.batchSeparator = this.readable ? "," + newLine : ",";\r
+               this.setKeys();\r
+               this.colon = this.readable ? ": " : ":";\r
+               this.tab = this.readable ? "\t" : "";\r
+               this.lineBreak = this.readable ? newLine : "";\r
+               this.customFields = [];\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout\r
+\r
+       JsonLayout.prototype = new Layout();\r
+\r
+       JsonLayout.prototype.isReadable = function() {\r
+               return this.readable;\r
+       };\r
+\r
+       JsonLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+    JsonLayout.prototype.format = function(loggingEvent) {\r
+        var layout = this;\r
+        var dataValues = this.getDataValues(loggingEvent, this.combineMessages);\r
+        var str = "{" + this.lineBreak;\r
+        var i, len;\r
+\r
+        function formatValue(val, prefix, expand) {\r
+            // Check the type of the data value to decide whether quotation marks\r
+            // or expansion are required\r
+            var formattedValue;\r
+            var valType = typeof val;\r
+            if (val instanceof Date) {\r
+                formattedValue = String(val.getTime());\r
+            } else if (expand && (val instanceof Array)) {\r
+                formattedValue = "[" + layout.lineBreak;\r
+                for (var i = 0, len = val.length; i < len; i++) {\r
+                    var childPrefix = prefix + layout.tab;\r
+                    formattedValue += childPrefix + formatValue(val[i], childPrefix, false);\r
+                    if (i < val.length - 1) {\r
+                        formattedValue += ",";\r
+                    }\r
+                    formattedValue += layout.lineBreak;\r
+                }\r
+                formattedValue += prefix + "]";\r
+            } else if (valType !== "number" && valType !== "boolean") {\r
+                formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";\r
+            } else {\r
+                formattedValue = val;\r
+            }\r
+            return formattedValue;\r
+        }\r
+\r
+        for (i = 0, len = dataValues.length - 1; i <= len; i++) {\r
+            str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);\r
+            if (i < len) {\r
+                str += ",";\r
+            }\r
+            str += this.lineBreak;\r
+        }\r
+\r
+        str += "}" + this.lineBreak;\r
+        return str;\r
+    };\r
+\r
+       JsonLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       JsonLayout.prototype.toString = function() {\r
+           return "JsonLayout";\r
+       };\r
+\r
+       JsonLayout.prototype.getContentType = function() {\r
+               return "application/json";\r
+       };\r
+\r
+       log4javascript.JsonLayout = JsonLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // HttpPostDataLayout\r
+\r
+       function HttpPostDataLayout() {\r
+               this.setKeys();\r
+               this.customFields = [];\r
+               this.returnsPostData = true;\r
+       }\r
+\r
+       HttpPostDataLayout.prototype = new Layout();\r
+\r
+       // Disable batching\r
+       HttpPostDataLayout.prototype.allowBatching = function() {\r
+               return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.format = function(loggingEvent) {\r
+               var dataValues = this.getDataValues(loggingEvent);\r
+               var queryBits = [];\r
+               for (var i = 0, len = dataValues.length; i < len; i++) {\r
+                       var val = (dataValues[i][1] instanceof Date) ?\r
+                               String(dataValues[i][1].getTime()) : dataValues[i][1];\r
+                       queryBits.push(urlEncode(dataValues[i][0]) + "=" + urlEncode(val));\r
+               }\r
+               return queryBits.join("&");\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {\r
+           return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.toString = function() {\r
+           return "HttpPostDataLayout";\r
+       };\r
+\r
+       log4javascript.HttpPostDataLayout = HttpPostDataLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // formatObjectExpansion\r
+\r
+       function formatObjectExpansion(obj, depth, indentation) {\r
+               var objectsExpanded = [];\r
+\r
+               function doFormat(obj, depth, indentation) {\r
+                       var i, j, len, childDepth, childIndentation, childLines, expansion,\r
+                               childExpansion;\r
+\r
+                       if (!indentation) {\r
+                               indentation = "";\r
+                       }\r
+\r
+                       function formatString(text) {\r
+                               var lines = splitIntoLines(text);\r
+                               for (var j = 1, jLen = lines.length; j < jLen; j++) {\r
+                                       lines[j] = indentation + lines[j];\r
+                               }\r
+                               return lines.join(newLine);\r
+                       }\r
+\r
+                       if (obj === null) {\r
+                               return "null";\r
+                       } else if (typeof obj == "undefined") {\r
+                               return "undefined";\r
+                       } else if (typeof obj == "string") {\r
+                               return formatString(obj);\r
+                       } else if (typeof obj == "object" && array_contains(objectsExpanded, obj)) {\r
+                               try {\r
+                                       expansion = toStr(obj);\r
+                               } catch (ex) {\r
+                                       expansion = "Error formatting property. Details: " + getExceptionStringRep(ex);\r
+                               }\r
+                               return expansion + " [already expanded]";\r
+                       } else if ((obj instanceof Array) && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "[" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i = 0, len = obj.length; i < len; i++) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + "Error formatting array member. Details: " +\r
+                                                       getExceptionStringRep(ex) + "");\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "]";\r
+                               return expansion;\r
+            } else if (Object.prototype.toString.call(obj) == "[object Date]") {\r
+                return obj.toString();\r
+                       } else if (typeof obj == "object" && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "{" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i in obj) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + i + ": " + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + i + ": Error formatting property. Details: " +\r
+                                                       getExceptionStringRep(ex));\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "}";\r
+                               return expansion;\r
+                       } else {\r
+                               return formatString(toStr(obj));\r
+                       }\r
+               }\r
+               return doFormat(obj, depth, indentation);\r
+       }\r
+       /* ---------------------------------------------------------------------- */\r
+       // Date-related stuff\r
+\r
+       var SimpleDateFormat;\r
+\r
+       (function() {\r
+               var regex = /('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;\r
+               var monthNames = ["January", "February", "March", "April", "May", "June",\r
+                       "July", "August", "September", "October", "November", "December"];\r
+               var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\r
+               var TEXT2 = 0, TEXT3 = 1, NUMBER = 2, YEAR = 3, MONTH = 4, TIMEZONE = 5;\r
+               var types = {\r
+                       G : TEXT2,\r
+                       y : YEAR,\r
+                       M : MONTH,\r
+                       w : NUMBER,\r
+                       W : NUMBER,\r
+                       D : NUMBER,\r
+                       d : NUMBER,\r
+                       F : NUMBER,\r
+                       E : TEXT3,\r
+                       a : TEXT2,\r
+                       H : NUMBER,\r
+                       k : NUMBER,\r
+                       K : NUMBER,\r
+                       h : NUMBER,\r
+                       m : NUMBER,\r
+                       s : NUMBER,\r
+                       S : NUMBER,\r
+                       Z : TIMEZONE\r
+               };\r
+               var ONE_DAY = 24 * 60 * 60 * 1000;\r
+               var ONE_WEEK = 7 * ONE_DAY;\r
+               var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK = 1;\r
+\r
+               var newDateAtMidnight = function(year, month, day) {\r
+                       var d = new Date(year, month, day, 0, 0, 0);\r
+                       d.setMilliseconds(0);\r
+                       return d;\r
+               };\r
+\r
+               Date.prototype.getDifference = function(date) {\r
+                       return this.getTime() - date.getTime();\r
+               };\r
+\r
+               Date.prototype.isBefore = function(d) {\r
+                       return this.getTime() < d.getTime();\r
+               };\r
+\r
+               Date.prototype.getUTCTime = function() {\r
+                       return Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(),\r
+                                       this.getSeconds(), this.getMilliseconds());\r
+               };\r
+\r
+               Date.prototype.getTimeSince = function(d) {\r
+                       return this.getUTCTime() - d.getUTCTime();\r
+               };\r
+\r
+               Date.prototype.getPreviousSunday = function() {\r
+                       // Using midday avoids any possibility of DST messing things up\r
+                       var midday = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 12, 0, 0);\r
+                       var previousSunday = new Date(midday.getTime() - this.getDay() * ONE_DAY);\r
+                       return newDateAtMidnight(previousSunday.getFullYear(), previousSunday.getMonth(),\r
+                                       previousSunday.getDate());\r
+               };\r
+\r
+               Date.prototype.getWeekInYear = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfYear) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfYear) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfYear.getDay();\r
+                       var weekInYear = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek < minimalDaysInFirstWeek) {\r
+                               weekInYear--;\r
+                       }\r
+                       return weekInYear;\r
+               };\r
+\r
+               Date.prototype.getWeekInMonth = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfMonth = newDateAtMidnight(this.getFullYear(), this.getMonth(), 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfMonth) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfMonth) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfMonth.getDay();\r
+                       var weekInMonth = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek >= minimalDaysInFirstWeek) {\r
+                               weekInMonth++;\r
+                       }\r
+                       return weekInMonth;\r
+               };\r
+\r
+               Date.prototype.getDayInYear = function() {\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       return 1 + Math.floor(this.getTimeSince(startOfYear) / ONE_DAY);\r
+               };\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               SimpleDateFormat = function(formatString) {\r
+                       this.formatString = formatString;\r
+               };\r
+\r
+               /**\r
+                * Sets the minimum number of days in a week in order for that week to\r
+                * be considered as belonging to a particular month or year\r
+                */\r
+               SimpleDateFormat.prototype.setMinimalDaysInFirstWeek = function(days) {\r
+                       this.minimalDaysInFirstWeek = days;\r
+               };\r
+\r
+               SimpleDateFormat.prototype.getMinimalDaysInFirstWeek = function() {\r
+                       return isUndefined(this.minimalDaysInFirstWeek) ?\r
+                               DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK : this.minimalDaysInFirstWeek;\r
+               };\r
+\r
+               var padWithZeroes = function(str, len) {\r
+                       while (str.length < len) {\r
+                               str = "0" + str;\r
+                       }\r
+                       return str;\r
+               };\r
+\r
+               var formatText = function(data, numberOfLetters, minLength) {\r
+                       return (numberOfLetters >= 4) ? data : data.substr(0, Math.max(minLength, numberOfLetters));\r
+               };\r
+\r
+               var formatNumber = function(data, numberOfLetters) {\r
+                       var dataString = "" + data;\r
+                       // Pad with 0s as necessary\r
+                       return padWithZeroes(dataString, numberOfLetters);\r
+               };\r
+\r
+               SimpleDateFormat.prototype.format = function(date) {\r
+                       var formattedString = "";\r
+                       var result;\r
+                       var searchString = this.formatString;\r
+                       while ((result = regex.exec(searchString))) {\r
+                               var quotedString = result[1];\r
+                               var patternLetters = result[2];\r
+                               var otherLetters = result[3];\r
+                               var otherCharacters = result[4];\r
+\r
+                               // If the pattern matched is quoted string, output the text between the quotes\r
+                               if (quotedString) {\r
+                                       if (quotedString == "''") {\r
+                                               formattedString += "'";\r
+                                       } else {\r
+                                               formattedString += quotedString.substring(1, quotedString.length - 1);\r
+                                       }\r
+                               } else if (otherLetters) {\r
+                                       // Swallow non-pattern letters by doing nothing here\r
+                               } else if (otherCharacters) {\r
+                                       // Simply output other characters\r
+                                       formattedString += otherCharacters;\r
+                               } else if (patternLetters) {\r
+                                       // Replace pattern letters\r
+                                       var patternLetter = patternLetters.charAt(0);\r
+                                       var numberOfLetters = patternLetters.length;\r
+                                       var rawData = "";\r
+                                       switch(patternLetter) {\r
+                                               case "G":\r
+                                                       rawData = "AD";\r
+                                                       break;\r
+                                               case "y":\r
+                                                       rawData = date.getFullYear();\r
+                                                       break;\r
+                                               case "M":\r
+                                                       rawData = date.getMonth();\r
+                                                       break;\r
+                                               case "w":\r
+                                                       rawData = date.getWeekInYear(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "W":\r
+                                                       rawData = date.getWeekInMonth(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "D":\r
+                                                       rawData = date.getDayInYear();\r
+                                                       break;\r
+                                               case "d":\r
+                                                       rawData = date.getDate();\r
+                                                       break;\r
+                                               case "F":\r
+                                                       rawData = 1 + Math.floor((date.getDate() - 1) / 7);\r
+                                                       break;\r
+                                               case "E":\r
+                                                       rawData = dayNames[date.getDay()];\r
+                                                       break;\r
+                                               case "a":\r
+                                                       rawData = (date.getHours() >= 12) ? "PM" : "AM";\r
+                                                       break;\r
+                                               case "H":\r
+                                                       rawData = date.getHours();\r
+                                                       break;\r
+                                               case "k":\r
+                                                       rawData = date.getHours() || 24;\r
+                                                       break;\r
+                                               case "K":\r
+                                                       rawData = date.getHours() % 12;\r
+                                                       break;\r
+                                               case "h":\r
+                                                       rawData = (date.getHours() % 12) || 12;\r
+                                                       break;\r
+                                               case "m":\r
+                                                       rawData = date.getMinutes();\r
+                                                       break;\r
+                                               case "s":\r
+                                                       rawData = date.getSeconds();\r
+                                                       break;\r
+                                               case "S":\r
+                                                       rawData = date.getMilliseconds();\r
+                                                       break;\r
+                                               case "Z":\r
+                                                       rawData = date.getTimezoneOffset(); // This returns the number of minutes since GMT was this time.\r
+                                                       break;\r
+                                       }\r
+                                       // Format the raw data depending on the type\r
+                                       switch(types[patternLetter]) {\r
+                                               case TEXT2:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 2);\r
+                                                       break;\r
+                                               case TEXT3:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 3);\r
+                                                       break;\r
+                                               case NUMBER:\r
+                                                       formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       break;\r
+                                               case YEAR:\r
+                                                       if (numberOfLetters <= 3) {\r
+                                                               // Output a 2-digit year\r
+                                                               var dataString = "" + rawData;\r
+                                                               formattedString += dataString.substr(2, 2);\r
+                                                       } else {\r
+                                                               formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case MONTH:\r
+                                                       if (numberOfLetters >= 3) {\r
+                                                               formattedString += formatText(monthNames[rawData], numberOfLetters, numberOfLetters);\r
+                                                       } else {\r
+                                                               // NB. Months returned by getMonth are zero-based\r
+                                                               formattedString += formatNumber(rawData + 1, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case TIMEZONE:\r
+                                                       var isPositive = (rawData > 0);\r
+                                                       // The following line looks like a mistake but isn't\r
+                                                       // because of the way getTimezoneOffset measures.\r
+                                                       var prefix = isPositive ? "-" : "+";\r
+                                                       var absData = Math.abs(rawData);\r
+\r
+                                                       // Hours\r
+                                                       var hours = "" + Math.floor(absData / 60);\r
+                                                       hours = padWithZeroes(hours, 2);\r
+                                                       // Minutes\r
+                                                       var minutes = "" + (absData % 60);\r
+                                                       minutes = padWithZeroes(minutes, 2);\r
+\r
+                                                       formattedString += prefix + hours + minutes;\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               searchString = searchString.substr(result.index + result[0].length);\r
+                       }\r
+                       return formattedString;\r
+               };\r
+       })();\r
+\r
+       log4javascript.SimpleDateFormat = SimpleDateFormat;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // PatternLayout\r
+\r
+       function PatternLayout(pattern) {\r
+               if (pattern) {\r
+                       this.pattern = pattern;\r
+               } else {\r
+                       this.pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;\r
+               }\r
+               this.customFields = [];\r
+       }\r
+\r
+       PatternLayout.TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n";\r
+       PatternLayout.DEFAULT_CONVERSION_PATTERN = "%m%n";\r
+       PatternLayout.ISO8601_DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";\r
+       PatternLayout.DATETIME_DATEFORMAT = "dd MMM yyyy HH:mm:ss,SSS";\r
+       PatternLayout.ABSOLUTETIME_DATEFORMAT = "HH:mm:ss,SSS";\r
+\r
+       PatternLayout.prototype = new Layout();\r
+\r
+       PatternLayout.prototype.format = function(loggingEvent) {\r
+               var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;\r
+               var formattedString = "";\r
+               var result;\r
+               var searchString = this.pattern;\r
+\r
+               // Cannot use regex global flag since it doesn't work with exec in IE5\r
+               while ((result = regex.exec(searchString))) {\r
+                       var matchedString = result[0];\r
+                       var padding = result[1];\r
+                       var truncation = result[2];\r
+                       var conversionCharacter = result[3];\r
+                       var specifier = result[5];\r
+                       var text = result[6];\r
+\r
+                       // Check if the pattern matched was just normal text\r
+                       if (text) {\r
+                               formattedString += "" + text;\r
+                       } else {\r
+                               // Create a raw replacement string based on the conversion\r
+                               // character and specifier\r
+                               var replacement = "";\r
+                               switch(conversionCharacter) {\r
+                                       case "a": // Array of messages\r
+                                       case "m": // Message\r
+                                               var depth = 0;\r
+                                               if (specifier) {\r
+                                                       depth = parseInt(specifier, 10);\r
+                                                       if (isNaN(depth)) {\r
+                                                               handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                       specifier + "' for conversion character '" + conversionCharacter +\r
+                                                                       "' - should be a number");\r
+                                                               depth = 0;\r
+                                                       }\r
+                                               }\r
+                                               var messages = (conversionCharacter === "a") ? loggingEvent.messages[0] : loggingEvent.messages;\r
+                                               for (var i = 0, len = messages.length; i < len; i++) {\r
+                                                       if (i > 0 && (replacement.charAt(replacement.length - 1) !== " ")) {\r
+                                                               replacement += " ";\r
+                                                       }\r
+                                                       if (depth === 0) {\r
+                                                               replacement += messages[i];\r
+                                                       } else {\r
+                                                               replacement += formatObjectExpansion(messages[i], depth);\r
+                                                       }\r
+                                               }\r
+                                               break;\r
+                                       case "c": // Logger name\r
+                                               var loggerName = loggingEvent.logger.name;\r
+                                               if (specifier) {\r
+                                                       var precision = parseInt(specifier, 10);\r
+                                                       var loggerNameBits = loggingEvent.logger.name.split(".");\r
+                                                       if (precision >= loggerNameBits.length) {\r
+                                                               replacement = loggerName;\r
+                                                       } else {\r
+                                                               replacement = loggerNameBits.slice(loggerNameBits.length - precision).join(".");\r
+                                                       }\r
+                                               } else {\r
+                                                       replacement = loggerName;\r
+                                               }\r
+                                               break;\r
+                                       case "d": // Date\r
+                                               var dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                               if (specifier) {\r
+                                                       dateFormat = specifier;\r
+                                                       // Pick up special cases\r
+                                                       if (dateFormat == "ISO8601") {\r
+                                                               dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                                       } else if (dateFormat == "ABSOLUTE") {\r
+                                                               dateFormat = PatternLayout.ABSOLUTETIME_DATEFORMAT;\r
+                                                       } else if (dateFormat == "DATE") {\r
+                                                               dateFormat = PatternLayout.DATETIME_DATEFORMAT;\r
+                                                       }\r
+                                               }\r
+                                               // Format the date\r
+                                               replacement = (new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);\r
+                                               break;\r
+                                       case "f": // Custom field\r
+                                               if (this.hasCustomFields()) {\r
+                                                       var fieldIndex = 0;\r
+                                                       if (specifier) {\r
+                                                               fieldIndex = parseInt(specifier, 10);\r
+                                                               if (isNaN(fieldIndex)) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - should be a number");\r
+                                                               } else if (fieldIndex === 0) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - must be greater than zero");\r
+                                                               } else if (fieldIndex > this.customFields.length) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - there aren't that many custom fields");\r
+                                                               } else {\r
+                                                                       fieldIndex = fieldIndex - 1;\r
+                                                               }\r
+                                                       }\r
+                            var val = this.customFields[fieldIndex].value;\r
+                            if (typeof val == "function") {\r
+                                val = val(this, loggingEvent);\r
+                            }\r
+                            replacement = val;\r
+                                               }\r
+                                               break;\r
+                                       case "n": // New line\r
+                                               replacement = newLine;\r
+                                               break;\r
+                                       case "p": // Level\r
+                                               replacement = loggingEvent.level.name;\r
+                                               break;\r
+                                       case "r": // Milliseconds since log4javascript startup\r
+                                               replacement = "" + loggingEvent.timeStamp.getDifference(applicationStartDate);\r
+                                               break;\r
+                                       case "%": // Literal % sign\r
+                                               replacement = "%";\r
+                                               break;\r
+                                       default:\r
+                                               replacement = matchedString;\r
+                                               break;\r
+                               }\r
+                               // Format the replacement according to any padding or\r
+                               // truncation specified\r
+                               var l;\r
+\r
+                               // First, truncation\r
+                               if (truncation) {\r
+                                       l = parseInt(truncation.substr(1), 10);\r
+                                       var strLen = replacement.length;\r
+                                       if (l < strLen) {\r
+                                               replacement = replacement.substring(strLen - l, strLen);\r
+                                       }\r
+                               }\r
+                               // Next, padding\r
+                               if (padding) {\r
+                                       if (padding.charAt(0) == "-") {\r
+                                               l = parseInt(padding.substr(1), 10);\r
+                                               // Right pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement += " ";\r
+                                               }\r
+                                       } else {\r
+                                               l = parseInt(padding, 10);\r
+                                               // Left pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement = " " + replacement;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               formattedString += replacement;\r
+                       }\r
+                       searchString = searchString.substr(result.index + result[0].length);\r
+               }\r
+               return formattedString;\r
+       };\r
+\r
+       PatternLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       PatternLayout.prototype.toString = function() {\r
+           return "PatternLayout";\r
+       };\r
+\r
+       log4javascript.PatternLayout = PatternLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender related\r
+\r
+       var xmlHttpFactories = [\r
+               function() { return new XMLHttpRequest(); },\r
+               function() { return new ActiveXObject("Msxml2.XMLHTTP"); },\r
+               function() { return new ActiveXObject("Microsoft.XMLHTTP"); }\r
+       ];\r
+\r
+       var getXmlHttp = function(errorHandler) {\r
+               // This is only run the first time; the value of getXmlHttp gets\r
+               // replaced with the factory that succeeds on the first run\r
+               var xmlHttp = null, factory;\r
+               for (var i = 0, len = xmlHttpFactories.length; i < len; i++) {\r
+                       factory = xmlHttpFactories[i];\r
+                       try {\r
+                               xmlHttp = factory();\r
+                               getXmlHttp = factory;\r
+                               return xmlHttp;\r
+                       } catch (e) {\r
+                       }\r
+               }\r
+               // If we're here, all factories have failed, so throw an error\r
+               if (errorHandler) {\r
+                       errorHandler();\r
+               } else {\r
+                       handleError("getXmlHttp: unable to obtain XMLHttpRequest object");\r
+               }\r
+       };\r
+\r
+       function isHttpRequestSuccessful(xmlHttp) {\r
+               return isUndefined(xmlHttp.status) || xmlHttp.status === 0 ||\r
+                       (xmlHttp.status >= 200 && xmlHttp.status < 300) ||\r
+                       xmlHttp.status == 1223 /* Fix for IE */;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender\r
+\r
+       function AjaxAppender(url) {\r
+               var appender = this;\r
+               var isSupported = true;\r
+               if (!url) {\r
+                       handleError("AjaxAppender: URL must be specified in constructor");\r
+                       isSupported = false;\r
+               }\r
+\r
+               var timed = this.defaults.timed;\r
+               var waitForResponse = this.defaults.waitForResponse;\r
+               var batchSize = this.defaults.batchSize;\r
+               var timerInterval = this.defaults.timerInterval;\r
+               var requestSuccessCallback = this.defaults.requestSuccessCallback;\r
+               var failCallback = this.defaults.failCallback;\r
+               var postVarName = this.defaults.postVarName;\r
+               var sendAllOnUnload = this.defaults.sendAllOnUnload;\r
+               var contentType = this.defaults.contentType;\r
+               var sessionId = null;\r
+\r
+               var queuedLoggingEvents = [];\r
+               var queuedRequests = [];\r
+               var headers = [];\r
+               var sending = false;\r
+               var initialized = false;\r
+\r
+               // Configuration methods. The function scope is used to prevent\r
+               // direct alteration to the appender configuration properties.\r
+               function checkCanConfigure(configOptionName) {\r
+                       if (initialized) {\r
+                               handleError("AjaxAppender: configuration option '" +\r
+                                       configOptionName +\r
+                                       "' may not be set after the appender has been initialized");\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               this.getSessionId = function() { return sessionId; };\r
+               this.setSessionId = function(sessionIdParam) {\r
+                       sessionId = extractStringFromParam(sessionIdParam, null);\r
+                       this.layout.setCustomField("sessionid", sessionId);\r
+               };\r
+\r
+               this.setLayout = function(layoutParam) {\r
+                       if (checkCanConfigure("layout")) {\r
+                               this.layout = layoutParam;\r
+                               // Set the session id as a custom field on the layout, if not already present\r
+                               if (sessionId !== null) {\r
+                                       this.setSessionId(sessionId);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.isTimed = function() { return timed; };\r
+               this.setTimed = function(timedParam) {\r
+                       if (checkCanConfigure("timed")) {\r
+                               timed = bool(timedParam);\r
+                       }\r
+               };\r
+\r
+               this.getTimerInterval = function() { return timerInterval; };\r
+               this.setTimerInterval = function(timerIntervalParam) {\r
+                       if (checkCanConfigure("timerInterval")) {\r
+                               timerInterval = extractIntFromParam(timerIntervalParam, timerInterval);\r
+                       }\r
+               };\r
+\r
+               this.isWaitForResponse = function() { return waitForResponse; };\r
+               this.setWaitForResponse = function(waitForResponseParam) {\r
+                       if (checkCanConfigure("waitForResponse")) {\r
+                               waitForResponse = bool(waitForResponseParam);\r
+                       }\r
+               };\r
+\r
+               this.getBatchSize = function() { return batchSize; };\r
+               this.setBatchSize = function(batchSizeParam) {\r
+                       if (checkCanConfigure("batchSize")) {\r
+                               batchSize = extractIntFromParam(batchSizeParam, batchSize);\r
+                       }\r
+               };\r
+\r
+               this.isSendAllOnUnload = function() { return sendAllOnUnload; };\r
+               this.setSendAllOnUnload = function(sendAllOnUnloadParam) {\r
+                       if (checkCanConfigure("sendAllOnUnload")) {\r
+                               sendAllOnUnload = extractBooleanFromParam(sendAllOnUnloadParam, sendAllOnUnload);\r
+                       }\r
+               };\r
+\r
+               this.setRequestSuccessCallback = function(requestSuccessCallbackParam) {\r
+                       requestSuccessCallback = extractFunctionFromParam(requestSuccessCallbackParam, requestSuccessCallback);\r
+               };\r
+\r
+               this.setFailCallback = function(failCallbackParam) {\r
+                       failCallback = extractFunctionFromParam(failCallbackParam, failCallback);\r
+               };\r
+\r
+               this.getPostVarName = function() { return postVarName; };\r
+               this.setPostVarName = function(postVarNameParam) {\r
+                       if (checkCanConfigure("postVarName")) {\r
+                               postVarName = extractStringFromParam(postVarNameParam, postVarName);\r
+                       }\r
+               };\r
+\r
+               this.getHeaders = function() { return headers; };\r
+               this.addHeader = function(name, value) {\r
+                       if (name.toLowerCase() == "content-type") {\r
+                               contentType = value;\r
+                       } else {\r
+                               headers.push( { name: name, value: value } );\r
+                       }\r
+               };\r
+\r
+               // Internal functions\r
+               function sendAll() {\r
+                       if (isSupported && enabled) {\r
+                               sending = true;\r
+                               var currentRequestBatch;\r
+                               if (waitForResponse) {\r
+                                       // Send the first request then use this function as the callback once\r
+                                       // the response comes back\r
+                                       if (queuedRequests.length > 0) {\r
+                                               currentRequestBatch = queuedRequests.shift();\r
+                                               sendRequest(preparePostData(currentRequestBatch), sendAll);\r
+                                       } else {\r
+                                               sending = false;\r
+                                               if (timed) {\r
+                                                       scheduleSending();\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       // Rattle off all the requests without waiting to see the response\r
+                                       while ((currentRequestBatch = queuedRequests.shift())) {\r
+                                               sendRequest(preparePostData(currentRequestBatch));\r
+                                       }\r
+                                       sending = false;\r
+                                       if (timed) {\r
+                                               scheduleSending();\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.sendAll = sendAll;\r
+\r
+               // Called when the window unloads. At this point we're past caring about\r
+               // waiting for responses or timers or incomplete batches - everything\r
+               // must go, now\r
+               function sendAllRemaining() {\r
+                       var sendingAnything = false;\r
+                       if (isSupported && enabled) {\r
+                               // Create requests for everything left over, batched as normal\r
+                               var actualBatchSize = appender.getLayout().allowBatching() ? batchSize : 1;\r
+                               var currentLoggingEvent;\r
+                               var batchedLoggingEvents = [];\r
+                               while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                       batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                               // Queue this batch of log entries\r
+                                               queuedRequests.push(batchedLoggingEvents);\r
+                                               batchedLoggingEvents = [];\r
+                                       }\r
+                               }\r
+                               // If there's a partially completed batch, add it\r
+                               if (batchedLoggingEvents.length > 0) {\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+                               }\r
+                               sendingAnything = (queuedRequests.length > 0);\r
+                               waitForResponse = false;\r
+                               timed = false;\r
+                               sendAll();\r
+                       }\r
+                       return sendingAnything;\r
+               }\r
+\r
+               this.sendAllRemaining = sendAllRemaining;\r
+\r
+               function preparePostData(batchedLoggingEvents) {\r
+                       // Format the logging events\r
+                       var formattedMessages = [];\r
+                       var currentLoggingEvent;\r
+                       var postData = "";\r
+                       while ((currentLoggingEvent = batchedLoggingEvents.shift())) {\r
+                               var currentFormattedMessage = appender.getLayout().format(currentLoggingEvent);\r
+                               if (appender.getLayout().ignoresThrowable()) {\r
+                                       currentFormattedMessage += currentLoggingEvent.getThrowableStrRep();\r
+                               }\r
+                               formattedMessages.push(currentFormattedMessage);\r
+                       }\r
+                       // Create the post data string\r
+                       if (batchedLoggingEvents.length == 1) {\r
+                               postData = formattedMessages.join("");\r
+                       } else {\r
+                               postData = appender.getLayout().batchHeader +\r
+                                       formattedMessages.join(appender.getLayout().batchSeparator) +\r
+                                       appender.getLayout().batchFooter;\r
+                       }\r
+                       if (contentType == appender.defaults.contentType) {\r
+                               postData = appender.getLayout().returnsPostData ? postData :\r
+                                       urlEncode(postVarName) + "=" + urlEncode(postData);\r
+                               // Add the layout name to the post data\r
+                               if (postData.length > 0) {\r
+                                       postData += "&";\r
+                               }\r
+                               postData += "layout=" + urlEncode(appender.getLayout().toString());\r
+                       }\r
+                       return postData;\r
+               }\r
+\r
+               function scheduleSending() {\r
+                       window.setTimeout(sendAll, timerInterval);\r
+               }\r
+\r
+               function xmlHttpErrorHandler() {\r
+                       var msg = "AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";\r
+                       handleError(msg);\r
+                       isSupported = false;\r
+                       if (failCallback) {\r
+                               failCallback(msg);\r
+                       }\r
+               }\r
+\r
+               function sendRequest(postData, successCallback) {\r
+                       try {\r
+                               var xmlHttp = getXmlHttp(xmlHttpErrorHandler);\r
+                               if (isSupported) {\r
+                                       if (xmlHttp.overrideMimeType) {\r
+                                               xmlHttp.overrideMimeType(appender.getLayout().getContentType());\r
+                                       }\r
+                                       xmlHttp.onreadystatechange = function() {\r
+                                               if (xmlHttp.readyState == 4) {\r
+                                                       if (isHttpRequestSuccessful(xmlHttp)) {\r
+                                                               if (requestSuccessCallback) {\r
+                                                                       requestSuccessCallback(xmlHttp);\r
+                                                               }\r
+                                                               if (successCallback) {\r
+                                                                       successCallback(xmlHttp);\r
+                                                               }\r
+                                                       } else {\r
+                                                               var msg = "AjaxAppender.append: XMLHttpRequest request to URL " +\r
+                                                                       url + " returned status code " + xmlHttp.status;\r
+                                                               handleError(msg);\r
+                                                               if (failCallback) {\r
+                                                                       failCallback(msg);\r
+                                                               }\r
+                                                       }\r
+                                                       xmlHttp.onreadystatechange = emptyFunction;\r
+                                                       xmlHttp = null;\r
+                                               }\r
+                                       };\r
+                                       xmlHttp.open("POST", url, true);\r
+                                       try {\r
+                                               for (var i = 0, header; header = headers[i++]; ) {\r
+                                                       xmlHttp.setRequestHeader(header.name, header.value);\r
+                                               }\r
+                                               xmlHttp.setRequestHeader("Content-Type", contentType);\r
+                                       } catch (headerEx) {\r
+                                               var msg = "AjaxAppender.append: your browser's XMLHttpRequest implementation" +\r
+                                                       " does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";\r
+                                               handleError(msg);\r
+                                               isSupported = false;\r
+                                               if (failCallback) {\r
+                                                       failCallback(msg);\r
+                                               }\r
+                                               return;\r
+                                       }\r
+                                       xmlHttp.send(postData);\r
+                               }\r
+                       } catch (ex) {\r
+                               var errMsg = "AjaxAppender.append: error sending log message to " + url;\r
+                               handleError(errMsg, ex);\r
+                               isSupported = false;\r
+                               if (failCallback) {\r
+                                       failCallback(errMsg + ". Details: " + getExceptionStringRep(ex));\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.append = function(loggingEvent) {\r
+                       if (isSupported) {\r
+                               if (!initialized) {\r
+                                       init();\r
+                               }\r
+                               queuedLoggingEvents.push(loggingEvent);\r
+                               var actualBatchSize = this.getLayout().allowBatching() ? batchSize : 1;\r
+\r
+                               if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                       var currentLoggingEvent;\r
+                                       var batchedLoggingEvents = [];\r
+                                       while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                               batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       }\r
+                                       // Queue this batch of log entries\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+\r
+                                       // If using a timer, the queue of requests will be processed by the\r
+                                       // timer function, so nothing needs to be done here.\r
+                                       if (!timed && (!waitForResponse || (waitForResponse && !sending))) {\r
+                                               sendAll();\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function init() {\r
+                       initialized = true;\r
+                       // Add unload event to send outstanding messages\r
+                       if (sendAllOnUnload) {\r
+                               var oldBeforeUnload = window.onbeforeunload;\r
+                               window.onbeforeunload = function() {\r
+                                       if (oldBeforeUnload) {\r
+                                               oldBeforeUnload();\r
+                                       }\r
+                                       if (sendAllRemaining()) {\r
+                                               return "Sending log messages";\r
+                                       }\r
+                               };\r
+                       }\r
+                       // Start timer\r
+                       if (timed) {\r
+                               scheduleSending();\r
+                       }\r
+               }\r
+       }\r
+\r
+       AjaxAppender.prototype = new Appender();\r
+\r
+       AjaxAppender.prototype.defaults = {\r
+               waitForResponse: false,\r
+               timed: false,\r
+               timerInterval: 1000,\r
+               batchSize: 1,\r
+               sendAllOnUnload: false,\r
+               requestSuccessCallback: null,\r
+               failCallback: null,\r
+               postVarName: "data",\r
+               contentType: "application/x-www-form-urlencoded"\r
+       };\r
+\r
+       AjaxAppender.prototype.layout = new HttpPostDataLayout();\r
+\r
+       AjaxAppender.prototype.toString = function() {\r
+               return "AjaxAppender";\r
+       };\r
+\r
+       log4javascript.AjaxAppender = AjaxAppender;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Main load\r
+\r
+   log4javascript.setDocumentReady = function() {\r
+       pageLoaded = true;\r
+       log4javascript.dispatchEvent("load", {});\r
+   };\r
+\r
+    if (window.addEventListener) {\r
+        window.addEventListener("load", log4javascript.setDocumentReady, false);\r
+    } else if (window.attachEvent) {\r
+        window.attachEvent("onload", log4javascript.setDocumentReady);\r
+    } else {\r
+        var oldOnload = window.onload;\r
+        if (typeof window.onload != "function") {\r
+            window.onload = log4javascript.setDocumentReady;\r
+        } else {\r
+            window.onload = function(evt) {\r
+                if (oldOnload) {\r
+                    oldOnload(evt);\r
+                }\r
+                log4javascript.setDocumentReady();\r
+            };\r
+        }\r
+    }\r
+\r
+    // Ensure that the log4javascript object is available in the window. This\r
+    // is necessary for log4javascript to be available in IE if loaded using\r
+    // Dojo's module system\r
+    window.log4javascript = log4javascript;\r
+\r
+    return log4javascript;\r
+})();
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/log4javascript_uncompressed.js
new file mode 100644 (file)
index 0000000..a644e3b
--- /dev/null
@@ -0,0 +1,5879 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+/**\r
+ * log4javascript\r
+ *\r
+ * log4javascript is a logging framework for JavaScript based on log4j\r
+ * for Java. This file contains all core log4javascript code and is the only\r
+ * file required to use log4javascript, unless you require support for\r
+ * document.domain, in which case you will also need console.html, which must be\r
+ * stored in the same directory as the main log4javascript.js file.\r
+ *\r
+ * Author: Tim Down <tim@log4javascript.org>\r
+ * Version: 1.4.6\r
+ * Edition: log4javascript\r
+ * Build date: 19 March 2013\r
+ * Website: http://log4javascript.org\r
+ */\r
+\r
+/* -------------------------------------------------------------------------- */\r
+// Array-related stuff\r
+\r
+// Next three methods are solely for IE5, which is missing them\r
+if (!Array.prototype.push) {\r
+       Array.prototype.push = function() {\r
+               for (var i = 0, len = arguments.length; i < len; i++){\r
+                       this[this.length] = arguments[i];\r
+               }\r
+               return this.length;\r
+       };\r
+}\r
+\r
+if (!Array.prototype.shift) {\r
+       Array.prototype.shift = function() {\r
+               if (this.length > 0) {\r
+                       var firstItem = this[0];\r
+                       for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                               this[i] = this[i + 1];\r
+                       }\r
+                       this.length = this.length - 1;\r
+                       return firstItem;\r
+               }\r
+       };\r
+}\r
+\r
+if (!Array.prototype.splice) {\r
+       Array.prototype.splice = function(startIndex, deleteCount) {\r
+               var itemsAfterDeleted = this.slice(startIndex + deleteCount);\r
+               var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);\r
+               this.length = startIndex;\r
+               // Copy the arguments into a proper Array object\r
+               var argumentsArray = [];\r
+               for (var i = 0, len = arguments.length; i < len; i++) {\r
+                       argumentsArray[i] = arguments[i];\r
+               }\r
+               var itemsToAppend = (argumentsArray.length > 2) ?\r
+                       itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;\r
+               for (i = 0, len = itemsToAppend.length; i < len; i++) {\r
+                       this.push(itemsToAppend[i]);\r
+               }\r
+               return itemsDeleted;\r
+       };\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+var log4javascript = (function() {\r
+\r
+       function isUndefined(obj) {\r
+               return typeof obj == "undefined";\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Custom event support\r
+\r
+       function EventSupport() {}\r
+\r
+       EventSupport.prototype = {\r
+               eventTypes: [],\r
+               eventListeners: {},\r
+               setEventTypes: function(eventTypesParam) {\r
+                       if (eventTypesParam instanceof Array) {\r
+                               this.eventTypes = eventTypesParam;\r
+                               this.eventListeners = {};\r
+                               for (var i = 0, len = this.eventTypes.length; i < len; i++) {\r
+                                       this.eventListeners[this.eventTypes[i]] = [];\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: setEventTypes: eventTypes parameter must be an Array");\r
+                       }\r
+               },\r
+\r
+               addEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: addEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               this.eventListeners[eventType].push(listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: addEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               removeEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               array_remove(this.eventListeners[eventType], listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               dispatchEvent: function(eventType, eventArgs) {\r
+                       if (array_contains(this.eventTypes, eventType)) {\r
+                               var listeners = this.eventListeners[eventType];\r
+                               for (var i = 0, len = listeners.length; i < len; i++) {\r
+                                       listeners[i](this, eventType, eventArgs);\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: dispatchEvent: no event called '" + eventType + "'");\r
+                       }\r
+               }\r
+       };\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+\r
+       var applicationStartDate = new Date();\r
+       var uniqueId = "log4javascript_" + applicationStartDate.getTime() + "_" +\r
+               Math.floor(Math.random() * 100000000);\r
+       var emptyFunction = function() {};\r
+       var newLine = "\r\n";\r
+       var pageLoaded = false;\r
+\r
+       // Create main log4javascript object; this will be assigned public properties\r
+       function Log4JavaScript() {}\r
+       Log4JavaScript.prototype = new EventSupport();\r
+\r
+       log4javascript = new Log4JavaScript();\r
+       log4javascript.version = "1.4.6";\r
+       log4javascript.edition = "log4javascript";\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+       // Utility functions\r
+\r
+       function toStr(obj) {\r
+               if (obj && obj.toString) {\r
+                       return obj.toString();\r
+               } else {\r
+                       return String(obj);\r
+               }\r
+       }\r
+\r
+       function getExceptionMessage(ex) {\r
+               if (ex.message) {\r
+                       return ex.message;\r
+               } else if (ex.description) {\r
+                       return ex.description;\r
+               } else {\r
+                       return toStr(ex);\r
+               }\r
+       }\r
+\r
+       // Gets the portion of the URL after the last slash\r
+       function getUrlFileName(url) {\r
+               var lastSlashIndex = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));\r
+               return url.substr(lastSlashIndex + 1);\r
+       }\r
+\r
+       // Returns a nicely formatted representation of an error\r
+       function getExceptionStringRep(ex) {\r
+               if (ex) {\r
+                       var exStr = "Exception: " + getExceptionMessage(ex);\r
+                       try {\r
+                               if (ex.lineNumber) {\r
+                                       exStr += " on line number " + ex.lineNumber;\r
+                               }\r
+                               if (ex.fileName) {\r
+                                       exStr += " in file " + getUrlFileName(ex.fileName);\r
+                               }\r
+                       } catch (localEx) {\r
+                               logLog.warn("Unable to obtain file and line information for error");\r
+                       }\r
+                       if (showStackTraces && ex.stack) {\r
+                               exStr += newLine + "Stack trace:" + newLine + ex.stack;\r
+                       }\r
+                       return exStr;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       function bool(obj) {\r
+               return Boolean(obj);\r
+       }\r
+\r
+       function trim(str) {\r
+               return str.replace(/^\s+/, "").replace(/\s+$/, "");\r
+       }\r
+\r
+       function splitIntoLines(text) {\r
+               // Ensure all line breaks are \n only\r
+               var text2 = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");\r
+               return text2.split("\n");\r
+       }\r
+\r
+       var urlEncode = (typeof window.encodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return encodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");\r
+               };\r
+\r
+       var urlDecode = (typeof window.decodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return decodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");\r
+               };\r
+\r
+       function array_remove(arr, val) {\r
+               var index = -1;\r
+               for (var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] === val) {\r
+                               index = i;\r
+                               break;\r
+                       }\r
+               }\r
+               if (index >= 0) {\r
+                       arr.splice(index, 1);\r
+                       return true;\r
+               } else {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       function array_contains(arr, val) {\r
+               for(var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] == val) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+       function extractBooleanFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return bool(param);\r
+               }\r
+       }\r
+\r
+       function extractStringFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return String(param);\r
+               }\r
+       }\r
+\r
+       function extractIntFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       try {\r
+                               var value = parseInt(param, 10);\r
+                               return isNaN(value) ? defaultValue : value;\r
+                       } catch (ex) {\r
+                               logLog.warn("Invalid int param " + param, ex);\r
+                               return defaultValue;\r
+                       }\r
+               }\r
+       }\r
+\r
+       function extractFunctionFromParam(param, defaultValue) {\r
+               if (typeof param == "function") {\r
+                       return param;\r
+               } else {\r
+                       return defaultValue;\r
+               }\r
+       }\r
+\r
+       function isError(err) {\r
+               return (err instanceof Error);\r
+       }\r
+\r
+       if (!Function.prototype.apply){\r
+               Function.prototype.apply = function(obj, args) {\r
+                       var methodName = "__apply__";\r
+                       if (typeof obj[methodName] != "undefined") {\r
+                               methodName += String(Math.random()).substr(2);\r
+                       }\r
+                       obj[methodName] = this;\r
+\r
+                       var argsStrings = [];\r
+                       for (var i = 0, len = args.length; i < len; i++) {\r
+                               argsStrings[i] = "args[" + i + "]";\r
+                       }\r
+                       var script = "obj." + methodName + "(" + argsStrings.join(",") + ")";\r
+                       var returnValue = eval(script);\r
+                       delete obj[methodName];\r
+                       return returnValue;\r
+               };\r
+       }\r
+\r
+       if (!Function.prototype.call){\r
+               Function.prototype.call = function(obj) {\r
+                       var args = [];\r
+                       for (var i = 1, len = arguments.length; i < len; i++) {\r
+                               args[i - 1] = arguments[i];\r
+                       }\r
+                       return this.apply(obj, args);\r
+               };\r
+       }\r
+\r
+       function getListenersPropertyName(eventName) {\r
+               return "__log4javascript_listeners__" + eventName;\r
+       }\r
+\r
+       function addEvent(node, eventName, listener, useCapture, win) {\r
+               win = win ? win : window;\r
+               if (node.addEventListener) {\r
+                       node.addEventListener(eventName, listener, useCapture);\r
+               } else if (node.attachEvent) {\r
+                       node.attachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (!node[propertyName]) {\r
+                               node[propertyName] = [];\r
+                               // Set event handler\r
+                               node["on" + eventName] = function(evt) {\r
+                                       evt = getEvent(evt, win);\r
+                                       var listenersPropertyName = getListenersPropertyName(eventName);\r
+\r
+                                       // Clone the array of listeners to leave the original untouched\r
+                                       var listeners = this[listenersPropertyName].concat([]);\r
+                                       var currentListener;\r
+\r
+                                       // Call each listener in turn\r
+                                       while ((currentListener = listeners.shift())) {\r
+                                               currentListener.call(this, evt);\r
+                                       }\r
+                               };\r
+                       }\r
+                       node[propertyName].push(listener);\r
+               }\r
+       }\r
+\r
+       function removeEvent(node, eventName, listener, useCapture) {\r
+               if (node.removeEventListener) {\r
+                       node.removeEventListener(eventName, listener, useCapture);\r
+               } else if (node.detachEvent) {\r
+                       node.detachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (node[propertyName]) {\r
+                               array_remove(node[propertyName], listener);\r
+                       }\r
+               }\r
+       }\r
+\r
+       function getEvent(evt, win) {\r
+               win = win ? win : window;\r
+               return evt ? evt : win.event;\r
+       }\r
+\r
+       function stopEventPropagation(evt) {\r
+               if (evt.stopPropagation) {\r
+                       evt.stopPropagation();\r
+               } else if (typeof evt.cancelBubble != "undefined") {\r
+                       evt.cancelBubble = true;\r
+               }\r
+               evt.returnValue = false;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Simple logging for log4javascript itself\r
+\r
+       var logLog = {\r
+               quietMode: false,\r
+\r
+               debugMessages: [],\r
+\r
+               setQuietMode: function(quietMode) {\r
+                       this.quietMode = bool(quietMode);\r
+               },\r
+\r
+               numberOfErrors: 0,\r
+\r
+               alertAllErrors: false,\r
+\r
+               setAlertAllErrors: function(alertAllErrors) {\r
+                       this.alertAllErrors = alertAllErrors;\r
+               },\r
+\r
+               debug: function(message) {\r
+                       this.debugMessages.push(message);\r
+               },\r
+\r
+               displayDebug: function() {\r
+                       alert(this.debugMessages.join(newLine));\r
+               },\r
+\r
+               warn: function(message, exception) {\r
+               },\r
+\r
+               error: function(message, exception) {\r
+                       if (++this.numberOfErrors == 1 || this.alertAllErrors) {\r
+                               if (!this.quietMode) {\r
+                                       var alertMessage = "log4javascript error: " + message;\r
+                                       if (exception) {\r
+                                               alertMessage += newLine + newLine + "Original error: " + getExceptionStringRep(exception);\r
+                                       }\r
+                                       alert(alertMessage);\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+       log4javascript.logLog = logLog;\r
+\r
+       log4javascript.setEventTypes(["load", "error"]);\r
+\r
+       function handleError(message, exception) {\r
+               logLog.error(message, exception);\r
+               log4javascript.dispatchEvent("error", { "message": message, "exception": exception });\r
+       }\r
+\r
+       log4javascript.handleError = handleError;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+\r
+       var enabled = !((typeof log4javascript_disabled != "undefined") &&\r
+                                       log4javascript_disabled);\r
+\r
+       log4javascript.setEnabled = function(enable) {\r
+               enabled = bool(enable);\r
+       };\r
+\r
+       log4javascript.isEnabled = function() {\r
+               return enabled;\r
+       };\r
+\r
+       var useTimeStampsInMilliseconds = true;\r
+\r
+       log4javascript.setTimeStampsInMilliseconds = function(timeStampsInMilliseconds) {\r
+               useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+       };\r
+\r
+       log4javascript.isTimeStampsInMilliseconds = function() {\r
+               return useTimeStampsInMilliseconds;\r
+       };\r
+       \r
+\r
+       // This evaluates the given expression in the current scope, thus allowing\r
+       // scripts to access private variables. Particularly useful for testing\r
+       log4javascript.evalInScope = function(expr) {\r
+               return eval(expr);\r
+       };\r
+\r
+       var showStackTraces = false;\r
+\r
+       log4javascript.setShowStackTraces = function(show) {\r
+               showStackTraces = bool(show);\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Levels\r
+\r
+       var Level = function(level, name) {\r
+               this.level = level;\r
+               this.name = name;\r
+       };\r
+\r
+       Level.prototype = {\r
+               toString: function() {\r
+                       return this.name;\r
+               },\r
+               equals: function(level) {\r
+                       return this.level == level.level;\r
+               },\r
+               isGreaterOrEqual: function(level) {\r
+                       return this.level >= level.level;\r
+               }\r
+       };\r
+\r
+       Level.ALL = new Level(Number.MIN_VALUE, "ALL");\r
+       Level.TRACE = new Level(10000, "TRACE");\r
+       Level.DEBUG = new Level(20000, "DEBUG");\r
+       Level.INFO = new Level(30000, "INFO");\r
+       Level.WARN = new Level(40000, "WARN");\r
+       Level.ERROR = new Level(50000, "ERROR");\r
+       Level.FATAL = new Level(60000, "FATAL");\r
+       Level.OFF = new Level(Number.MAX_VALUE, "OFF");\r
+\r
+       log4javascript.Level = Level;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Timers\r
+\r
+       function Timer(name, level) {\r
+               this.name = name;\r
+               this.level = isUndefined(level) ? Level.INFO : level;\r
+               this.start = new Date();\r
+       }\r
+\r
+       Timer.prototype.getElapsedTime = function() {\r
+               return new Date().getTime() - this.start.getTime();\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Loggers\r
+\r
+       var anonymousLoggerName = "[anonymous]";\r
+       var defaultLoggerName = "[default]";\r
+       var nullLoggerName = "[null]";\r
+       var rootLoggerName = "root";\r
+\r
+       function Logger(name) {\r
+               this.name = name;\r
+               this.parent = null;\r
+               this.children = [];\r
+\r
+               var appenders = [];\r
+               var loggerLevel = null;\r
+               var isRoot = (this.name === rootLoggerName);\r
+               var isNull = (this.name === nullLoggerName);\r
+\r
+               var appenderCache = null;\r
+               var appenderCacheInvalidated = false;\r
+               \r
+               this.addChild = function(childLogger) {\r
+                       this.children.push(childLogger);\r
+                       childLogger.parent = this;\r
+                       childLogger.invalidateAppenderCache();\r
+               };\r
+\r
+               // Additivity\r
+               var additive = true;\r
+               this.getAdditivity = function() {\r
+                       return additive;\r
+               };\r
+\r
+               this.setAdditivity = function(additivity) {\r
+                       var valueChanged = (additive != additivity);\r
+                       additive = additivity;\r
+                       if (valueChanged) {\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               // Create methods that use the appenders variable in this scope\r
+               this.addAppender = function(appender) {\r
+                       if (isNull) {\r
+                               handleError("Logger.addAppender: you may not add an appender to the null logger");\r
+                       } else {\r
+                               if (appender instanceof log4javascript.Appender) {\r
+                                       if (!array_contains(appenders, appender)) {\r
+                                               appenders.push(appender);\r
+                                               appender.setAddedToLogger(this);\r
+                                               this.invalidateAppenderCache();\r
+                                       }\r
+                               } else {\r
+                                       handleError("Logger.addAppender: appender supplied ('" +\r
+                                               toStr(appender) + "') is not a subclass of Appender");\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.removeAppender = function(appender) {\r
+                       array_remove(appenders, appender);\r
+                       appender.setRemovedFromLogger(this);\r
+                       this.invalidateAppenderCache();\r
+               };\r
+\r
+               this.removeAllAppenders = function() {\r
+                       var appenderCount = appenders.length;\r
+                       if (appenderCount > 0) {\r
+                               for (var i = 0; i < appenderCount; i++) {\r
+                                       appenders[i].setRemovedFromLogger(this);\r
+                               }\r
+                               appenders.length = 0;\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.getEffectiveAppenders = function() {\r
+                       if (appenderCache === null || appenderCacheInvalidated) {\r
+                               // Build appender cache\r
+                               var parentEffectiveAppenders = (isRoot || !this.getAdditivity()) ?\r
+                                       [] : this.parent.getEffectiveAppenders();\r
+                               appenderCache = parentEffectiveAppenders.concat(appenders);\r
+                               appenderCacheInvalidated = false;\r
+                       }\r
+                       return appenderCache;\r
+               };\r
+               \r
+               this.invalidateAppenderCache = function() {\r
+                       appenderCacheInvalidated = true;\r
+                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                               this.children[i].invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.log = function(level, params) {\r
+                       if (enabled && level.isGreaterOrEqual(this.getEffectiveLevel())) {\r
+                               // Check whether last param is an exception\r
+                               var exception;\r
+                               var finalParamIndex = params.length - 1;\r
+                               var lastParam = params[finalParamIndex];\r
+                               if (params.length > 1 && isError(lastParam)) {\r
+                                       exception = lastParam;\r
+                                       finalParamIndex--;\r
+                               }\r
+\r
+                               // Construct genuine array for the params\r
+                               var messages = [];\r
+                               for (var i = 0; i <= finalParamIndex; i++) {\r
+                                       messages[i] = params[i];\r
+                               }\r
+\r
+                               var loggingEvent = new LoggingEvent(\r
+                                       this, new Date(), level, messages, exception);\r
+\r
+                               this.callAppenders(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.callAppenders = function(loggingEvent) {\r
+                       var effectiveAppenders = this.getEffectiveAppenders();\r
+                       for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                               effectiveAppenders[i].doAppend(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.setLevel = function(level) {\r
+                       // Having a level of null on the root logger would be very bad.\r
+                       if (isRoot && level === null) {\r
+                               handleError("Logger.setLevel: you cannot set the level of the root logger to null");\r
+                       } else if (level instanceof Level) {\r
+                               loggerLevel = level;\r
+                       } else {\r
+                               handleError("Logger.setLevel: level supplied to logger " +\r
+                                       this.name + " is not an instance of log4javascript.Level");\r
+                       }\r
+               };\r
+\r
+               this.getLevel = function() {\r
+                       return loggerLevel;\r
+               };\r
+\r
+               this.getEffectiveLevel = function() {\r
+                       for (var logger = this; logger !== null; logger = logger.parent) {\r
+                               var level = logger.getLevel();\r
+                               if (level !== null) {\r
+                                       return level;\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.group = function(name, initiallyExpanded) {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].group(name, initiallyExpanded);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.groupEnd = function() {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].groupEnd();\r
+                               }\r
+                       }\r
+               };\r
+\r
+               var timers = {};\r
+\r
+               this.time = function(name, level) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.time: a name for the timer must be supplied");\r
+                               } else if (level && !(level instanceof Level)) {\r
+                                       handleError("Logger.time: level supplied to timer " +\r
+                                               name + " is not an instance of log4javascript.Level");\r
+                               } else {\r
+                                       timers[name] = new Timer(name, level);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.timeEnd = function(name) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.timeEnd: a name for the timer must be supplied");\r
+                               } else if (timers[name]) {\r
+                                       var timer = timers[name];\r
+                                       var milliseconds = timer.getElapsedTime();\r
+                                       this.log(timer.level, ["Timer " + toStr(name) + " completed in " + milliseconds + "ms"]);\r
+                                       delete timers[name];\r
+                               } else {\r
+                                       logLog.warn("Logger.timeEnd: no timer found with name " + name);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.assert = function(expr) {\r
+                       if (enabled && !expr) {\r
+                               var args = [];\r
+                               for (var i = 1, len = arguments.length; i < len; i++) {\r
+                                       args.push(arguments[i]);\r
+                               }\r
+                               args = (args.length > 0) ? args : ["Assertion Failure"];\r
+                               args.push(newLine);\r
+                               args.push(expr);\r
+                               this.log(Level.ERROR, args);\r
+                       }\r
+               };\r
+\r
+               this.toString = function() {\r
+                       return "Logger[" + this.name + "]";\r
+               };\r
+       }\r
+\r
+       Logger.prototype = {\r
+               trace: function() {\r
+                       this.log(Level.TRACE, arguments);\r
+               },\r
+\r
+               debug: function() {\r
+                       this.log(Level.DEBUG, arguments);\r
+               },\r
+\r
+               info: function() {\r
+                       this.log(Level.INFO, arguments);\r
+               },\r
+\r
+               warn: function() {\r
+                       this.log(Level.WARN, arguments);\r
+               },\r
+\r
+               error: function() {\r
+                       this.log(Level.ERROR, arguments);\r
+               },\r
+\r
+               fatal: function() {\r
+                       this.log(Level.FATAL, arguments);\r
+               },\r
+\r
+               isEnabledFor: function(level) {\r
+                       return level.isGreaterOrEqual(this.getEffectiveLevel());\r
+               },\r
+\r
+               isTraceEnabled: function() {\r
+                       return this.isEnabledFor(Level.TRACE);\r
+               },\r
+\r
+               isDebugEnabled: function() {\r
+                       return this.isEnabledFor(Level.DEBUG);\r
+               },\r
+\r
+               isInfoEnabled: function() {\r
+                       return this.isEnabledFor(Level.INFO);\r
+               },\r
+\r
+               isWarnEnabled: function() {\r
+                       return this.isEnabledFor(Level.WARN);\r
+               },\r
+\r
+               isErrorEnabled: function() {\r
+                       return this.isEnabledFor(Level.ERROR);\r
+               },\r
+\r
+               isFatalEnabled: function() {\r
+                       return this.isEnabledFor(Level.FATAL);\r
+               }\r
+       };\r
+\r
+       Logger.prototype.trace.isEntryPoint = true;\r
+       Logger.prototype.debug.isEntryPoint = true;\r
+       Logger.prototype.info.isEntryPoint = true;\r
+       Logger.prototype.warn.isEntryPoint = true;\r
+       Logger.prototype.error.isEntryPoint = true;\r
+       Logger.prototype.fatal.isEntryPoint = true;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logger access methods\r
+\r
+       // Hashtable of loggers keyed by logger name\r
+       var loggers = {};\r
+       var loggerNames = [];\r
+\r
+       var ROOT_LOGGER_DEFAULT_LEVEL = Level.DEBUG;\r
+       var rootLogger = new Logger(rootLoggerName);\r
+       rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+\r
+       log4javascript.getRootLogger = function() {\r
+               return rootLogger;\r
+       };\r
+\r
+       log4javascript.getLogger = function(loggerName) {\r
+               // Use default logger if loggerName is not specified or invalid\r
+               if (!(typeof loggerName == "string")) {\r
+                       loggerName = anonymousLoggerName;\r
+                       logLog.warn("log4javascript.getLogger: non-string logger name " +\r
+                               toStr(loggerName) + " supplied, returning anonymous logger");\r
+               }\r
+\r
+               // Do not allow retrieval of the root logger by name\r
+               if (loggerName == rootLoggerName) {\r
+                       handleError("log4javascript.getLogger: root logger may not be obtained by name");\r
+               }\r
+\r
+               // Create the logger for this name if it doesn't already exist\r
+               if (!loggers[loggerName]) {\r
+                       var logger = new Logger(loggerName);\r
+                       loggers[loggerName] = logger;\r
+                       loggerNames.push(loggerName);\r
+\r
+                       // Set up parent logger, if it doesn't exist\r
+                       var lastDotIndex = loggerName.lastIndexOf(".");\r
+                       var parentLogger;\r
+                       if (lastDotIndex > -1) {\r
+                               var parentLoggerName = loggerName.substring(0, lastDotIndex);\r
+                               parentLogger = log4javascript.getLogger(parentLoggerName); // Recursively sets up grandparents etc.\r
+                       } else {\r
+                               parentLogger = rootLogger;\r
+                       }\r
+                       parentLogger.addChild(logger);\r
+               }\r
+               return loggers[loggerName];\r
+       };\r
+\r
+       var defaultLogger = null;\r
+       log4javascript.getDefaultLogger = function() {\r
+               if (!defaultLogger) {\r
+                       defaultLogger = log4javascript.getLogger(defaultLoggerName);\r
+                       var a = new log4javascript.PopUpAppender();\r
+                       defaultLogger.addAppender(a);\r
+               }\r
+               return defaultLogger;\r
+       };\r
+\r
+       var nullLogger = null;\r
+       log4javascript.getNullLogger = function() {\r
+               if (!nullLogger) {\r
+                       nullLogger = new Logger(nullLoggerName);\r
+                       nullLogger.setLevel(Level.OFF);\r
+               }\r
+               return nullLogger;\r
+       };\r
+\r
+       // Destroys all loggers\r
+       log4javascript.resetConfiguration = function() {\r
+               rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+               loggers = {};\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logging events\r
+\r
+       var LoggingEvent = function(logger, timeStamp, level, messages,\r
+                       exception) {\r
+               this.logger = logger;\r
+               this.timeStamp = timeStamp;\r
+               this.timeStampInMilliseconds = timeStamp.getTime();\r
+               this.timeStampInSeconds = Math.floor(this.timeStampInMilliseconds / 1000);\r
+               this.milliseconds = this.timeStamp.getMilliseconds();\r
+               this.level = level;\r
+               this.messages = messages;\r
+               this.exception = exception;\r
+       };\r
+\r
+       LoggingEvent.prototype = {\r
+               getThrowableStrRep: function() {\r
+                       return this.exception ?\r
+                               getExceptionStringRep(this.exception) : "";\r
+               },\r
+               getCombinedMessages: function() {\r
+                       return (this.messages.length == 1) ? this.messages[0] :\r
+                                  this.messages.join(newLine);\r
+               },\r
+               toString: function() {\r
+                       return "LoggingEvent[" + this.level + "]";\r
+               }\r
+       };\r
+\r
+       log4javascript.LoggingEvent = LoggingEvent;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Layout prototype\r
+\r
+       var Layout = function() {\r
+       };\r
+\r
+       Layout.prototype = {\r
+               defaults: {\r
+                       loggerKey: "logger",\r
+                       timeStampKey: "timestamp",\r
+                       millisecondsKey: "milliseconds",\r
+                       levelKey: "level",\r
+                       messageKey: "message",\r
+                       exceptionKey: "exception",\r
+                       urlKey: "url"\r
+               },\r
+               loggerKey: "logger",\r
+               timeStampKey: "timestamp",\r
+               millisecondsKey: "milliseconds",\r
+               levelKey: "level",\r
+               messageKey: "message",\r
+               exceptionKey: "exception",\r
+               urlKey: "url",\r
+               batchHeader: "",\r
+               batchFooter: "",\r
+               batchSeparator: "",\r
+               returnsPostData: false,\r
+               overrideTimeStampsSetting: false,\r
+               useTimeStampsInMilliseconds: null,\r
+\r
+               format: function() {\r
+                       handleError("Layout.format: layout supplied has no format() method");\r
+               },\r
+\r
+               ignoresThrowable: function() {\r
+                       handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");\r
+               },\r
+\r
+               getContentType: function() {\r
+                       return "text/plain";\r
+               },\r
+\r
+               allowBatching: function() {\r
+                       return true;\r
+               },\r
+\r
+               setTimeStampsInMilliseconds: function(timeStampsInMilliseconds) {\r
+                       this.overrideTimeStampsSetting = true;\r
+                       this.useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+               },\r
+\r
+               isTimeStampsInMilliseconds: function() {\r
+                       return this.overrideTimeStampsSetting ?\r
+                               this.useTimeStampsInMilliseconds : useTimeStampsInMilliseconds;\r
+               },\r
+\r
+               getTimeStampValue: function(loggingEvent) {\r
+                       return this.isTimeStampsInMilliseconds() ?\r
+                               loggingEvent.timeStampInMilliseconds : loggingEvent.timeStampInSeconds;\r
+               },\r
+\r
+               getDataValues: function(loggingEvent, combineMessages) {\r
+                       var dataValues = [\r
+                               [this.loggerKey, loggingEvent.logger.name],\r
+                               [this.timeStampKey, this.getTimeStampValue(loggingEvent)],\r
+                               [this.levelKey, loggingEvent.level.name],\r
+                               [this.urlKey, window.location.href],\r
+                               [this.messageKey, combineMessages ? loggingEvent.getCombinedMessages() : loggingEvent.messages]\r
+                       ];\r
+                       if (!this.isTimeStampsInMilliseconds()) {\r
+                               dataValues.push([this.millisecondsKey, loggingEvent.milliseconds]);\r
+                       }\r
+                       if (loggingEvent.exception) {\r
+                               dataValues.push([this.exceptionKey, getExceptionStringRep(loggingEvent.exception)]);\r
+                       }\r
+                       if (this.hasCustomFields()) {\r
+                               for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                                       var val = this.customFields[i].value;\r
+\r
+                                       // Check if the value is a function. If so, execute it, passing it the\r
+                                       // current layout and the logging event\r
+                                       if (typeof val === "function") {\r
+                                               val = val(this, loggingEvent);\r
+                                       }\r
+                                       dataValues.push([this.customFields[i].name, val]);\r
+                               }\r
+                       }\r
+                       return dataValues;\r
+               },\r
+\r
+               setKeys: function(loggerKey, timeStampKey, levelKey, messageKey,\r
+                               exceptionKey, urlKey, millisecondsKey) {\r
+                       this.loggerKey = extractStringFromParam(loggerKey, this.defaults.loggerKey);\r
+                       this.timeStampKey = extractStringFromParam(timeStampKey, this.defaults.timeStampKey);\r
+                       this.levelKey = extractStringFromParam(levelKey, this.defaults.levelKey);\r
+                       this.messageKey = extractStringFromParam(messageKey, this.defaults.messageKey);\r
+                       this.exceptionKey = extractStringFromParam(exceptionKey, this.defaults.exceptionKey);\r
+                       this.urlKey = extractStringFromParam(urlKey, this.defaults.urlKey);\r
+                       this.millisecondsKey = extractStringFromParam(millisecondsKey, this.defaults.millisecondsKey);\r
+               },\r
+\r
+               setCustomField: function(name, value) {\r
+                       var fieldUpdated = false;\r
+                       for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                               if (this.customFields[i].name === name) {\r
+                                       this.customFields[i].value = value;\r
+                                       fieldUpdated = true;\r
+                               }\r
+                       }\r
+                       if (!fieldUpdated) {\r
+                               this.customFields.push({"name": name, "value": value});\r
+                       }\r
+               },\r
+\r
+               hasCustomFields: function() {\r
+                       return (this.customFields.length > 0);\r
+               },\r
+\r
+               toString: function() {\r
+                       handleError("Layout.toString: all layouts must override this method");\r
+               }\r
+       };\r
+\r
+       log4javascript.Layout = Layout;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Appender prototype\r
+\r
+       var Appender = function() {};\r
+\r
+       Appender.prototype = new EventSupport();\r
+\r
+       Appender.prototype.layout = new PatternLayout();\r
+       Appender.prototype.threshold = Level.ALL;\r
+       Appender.prototype.loggers = [];\r
+\r
+       // Performs threshold checks before delegating actual logging to the\r
+       // subclass's specific append method.\r
+       Appender.prototype.doAppend = function(loggingEvent) {\r
+               if (enabled && loggingEvent.level.level >= this.threshold.level) {\r
+                       this.append(loggingEvent);\r
+               }\r
+       };\r
+\r
+       Appender.prototype.append = function(loggingEvent) {};\r
+\r
+       Appender.prototype.setLayout = function(layout) {\r
+               if (layout instanceof Layout) {\r
+                       this.layout = layout;\r
+               } else {\r
+                       handleError("Appender.setLayout: layout supplied to " +\r
+                               this.toString() + " is not a subclass of Layout");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getLayout = function() {\r
+               return this.layout;\r
+       };\r
+\r
+       Appender.prototype.setThreshold = function(threshold) {\r
+               if (threshold instanceof Level) {\r
+                       this.threshold = threshold;\r
+               } else {\r
+                       handleError("Appender.setThreshold: threshold supplied to " +\r
+                               this.toString() + " is not a subclass of Level");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getThreshold = function() {\r
+               return this.threshold;\r
+       };\r
+\r
+       Appender.prototype.setAddedToLogger = function(logger) {\r
+               this.loggers.push(logger);\r
+       };\r
+\r
+       Appender.prototype.setRemovedFromLogger = function(logger) {\r
+               array_remove(this.loggers, logger);\r
+       };\r
+\r
+       Appender.prototype.group = emptyFunction;\r
+       Appender.prototype.groupEnd = emptyFunction;\r
+\r
+       Appender.prototype.toString = function() {\r
+               handleError("Appender.toString: all appenders must override this method");\r
+       };\r
+\r
+       log4javascript.Appender = Appender;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // SimpleLayout \r
+\r
+       function SimpleLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       SimpleLayout.prototype = new Layout();\r
+\r
+       SimpleLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.level.name + " - " + loggingEvent.getCombinedMessages();\r
+       };\r
+\r
+       SimpleLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       SimpleLayout.prototype.toString = function() {\r
+           return "SimpleLayout";\r
+       };\r
+\r
+       log4javascript.SimpleLayout = SimpleLayout;\r
+       /* ----------------------------------------------------------------------- */\r
+       // NullLayout \r
+\r
+       function NullLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       NullLayout.prototype = new Layout();\r
+\r
+       NullLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.messages;\r
+       };\r
+\r
+       NullLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       NullLayout.prototype.toString = function() {\r
+           return "NullLayout";\r
+       };\r
+\r
+       log4javascript.NullLayout = NullLayout;\r
+/* ---------------------------------------------------------------------- */\r
+       // XmlLayout\r
+\r
+       function XmlLayout(combineMessages) {\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.customFields = [];\r
+       }\r
+\r
+       XmlLayout.prototype = new Layout();\r
+\r
+       XmlLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+       XmlLayout.prototype.getContentType = function() {\r
+               return "text/xml";\r
+       };\r
+\r
+       XmlLayout.prototype.escapeCdata = function(str) {\r
+               return str.replace(/\]\]>/, "]]>]]&gt;<![CDATA[");\r
+       };\r
+\r
+       XmlLayout.prototype.format = function(loggingEvent) {\r
+               var layout = this;\r
+               var i, len;\r
+               function formatMessage(message) {\r
+                       message = (typeof message === "string") ? message : toStr(message);\r
+                       return "<log4javascript:message><![CDATA[" +\r
+                               layout.escapeCdata(message) + "]]></log4javascript:message>";\r
+               }\r
+\r
+               var str = "<log4javascript:event logger=\"" + loggingEvent.logger.name +\r
+                       "\" timestamp=\"" + this.getTimeStampValue(loggingEvent) + "\"";\r
+               if (!this.isTimeStampsInMilliseconds()) {\r
+                       str += " milliseconds=\"" + loggingEvent.milliseconds + "\"";\r
+               }\r
+               str += " level=\"" + loggingEvent.level.name + "\">" + newLine;\r
+               if (this.combineMessages) {\r
+                       str += formatMessage(loggingEvent.getCombinedMessages());\r
+               } else {\r
+                       str += "<log4javascript:messages>" + newLine;\r
+                       for (i = 0, len = loggingEvent.messages.length; i < len; i++) {\r
+                               str += formatMessage(loggingEvent.messages[i]) + newLine;\r
+                       }\r
+                       str += "</log4javascript:messages>" + newLine;\r
+               }\r
+               if (this.hasCustomFields()) {\r
+                       for (i = 0, len = this.customFields.length; i < len; i++) {\r
+                               str += "<log4javascript:customfield name=\"" +\r
+                                       this.customFields[i].name + "\"><![CDATA[" +\r
+                                       this.customFields[i].value.toString() +\r
+                                       "]]></log4javascript:customfield>" + newLine;\r
+                       }\r
+               }\r
+               if (loggingEvent.exception) {\r
+                       str += "<log4javascript:exception><![CDATA[" +\r
+                               getExceptionStringRep(loggingEvent.exception) +\r
+                               "]]></log4javascript:exception>" + newLine;\r
+               }\r
+               str += "</log4javascript:event>" + newLine + newLine;\r
+               return str;\r
+       };\r
+\r
+       XmlLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       XmlLayout.prototype.toString = function() {\r
+           return "XmlLayout";\r
+       };\r
+\r
+       log4javascript.XmlLayout = XmlLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout related\r
+\r
+       function escapeNewLines(str) {\r
+               return str.replace(/\r\n|\r|\n/g, "\\r\\n");\r
+       }\r
+\r
+       function JsonLayout(readable, combineMessages) {\r
+               this.readable = extractBooleanFromParam(readable, false);\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.batchHeader = this.readable ? "[" + newLine : "[";\r
+               this.batchFooter = this.readable ? "]" + newLine : "]";\r
+               this.batchSeparator = this.readable ? "," + newLine : ",";\r
+               this.setKeys();\r
+               this.colon = this.readable ? ": " : ":";\r
+               this.tab = this.readable ? "\t" : "";\r
+               this.lineBreak = this.readable ? newLine : "";\r
+               this.customFields = [];\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout\r
+\r
+       JsonLayout.prototype = new Layout();\r
+\r
+       JsonLayout.prototype.isReadable = function() {\r
+               return this.readable;\r
+       };\r
+\r
+       JsonLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+    JsonLayout.prototype.format = function(loggingEvent) {\r
+        var layout = this;\r
+        var dataValues = this.getDataValues(loggingEvent, this.combineMessages);\r
+        var str = "{" + this.lineBreak;\r
+        var i, len;\r
+\r
+        function formatValue(val, prefix, expand) {\r
+            // Check the type of the data value to decide whether quotation marks\r
+            // or expansion are required\r
+            var formattedValue;\r
+            var valType = typeof val;\r
+            if (val instanceof Date) {\r
+                formattedValue = String(val.getTime());\r
+            } else if (expand && (val instanceof Array)) {\r
+                formattedValue = "[" + layout.lineBreak;\r
+                for (var i = 0, len = val.length; i < len; i++) {\r
+                    var childPrefix = prefix + layout.tab;\r
+                    formattedValue += childPrefix + formatValue(val[i], childPrefix, false);\r
+                    if (i < val.length - 1) {\r
+                        formattedValue += ",";\r
+                    }\r
+                    formattedValue += layout.lineBreak;\r
+                }\r
+                formattedValue += prefix + "]";\r
+            } else if (valType !== "number" && valType !== "boolean") {\r
+                formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";\r
+            } else {\r
+                formattedValue = val;\r
+            }\r
+            return formattedValue;\r
+        }\r
+\r
+        for (i = 0, len = dataValues.length - 1; i <= len; i++) {\r
+            str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);\r
+            if (i < len) {\r
+                str += ",";\r
+            }\r
+            str += this.lineBreak;\r
+        }\r
+\r
+        str += "}" + this.lineBreak;\r
+        return str;\r
+    };\r
+\r
+       JsonLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       JsonLayout.prototype.toString = function() {\r
+           return "JsonLayout";\r
+       };\r
+\r
+       JsonLayout.prototype.getContentType = function() {\r
+               return "application/json";\r
+       };\r
+\r
+       log4javascript.JsonLayout = JsonLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // HttpPostDataLayout\r
+\r
+       function HttpPostDataLayout() {\r
+               this.setKeys();\r
+               this.customFields = [];\r
+               this.returnsPostData = true;\r
+       }\r
+\r
+       HttpPostDataLayout.prototype = new Layout();\r
+\r
+       // Disable batching\r
+       HttpPostDataLayout.prototype.allowBatching = function() {\r
+               return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.format = function(loggingEvent) {\r
+               var dataValues = this.getDataValues(loggingEvent);\r
+               var queryBits = [];\r
+               for (var i = 0, len = dataValues.length; i < len; i++) {\r
+                       var val = (dataValues[i][1] instanceof Date) ?\r
+                               String(dataValues[i][1].getTime()) : dataValues[i][1];\r
+                       queryBits.push(urlEncode(dataValues[i][0]) + "=" + urlEncode(val));\r
+               }\r
+               return queryBits.join("&");\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {\r
+           return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.toString = function() {\r
+           return "HttpPostDataLayout";\r
+       };\r
+\r
+       log4javascript.HttpPostDataLayout = HttpPostDataLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // formatObjectExpansion\r
+\r
+       function formatObjectExpansion(obj, depth, indentation) {\r
+               var objectsExpanded = [];\r
+\r
+               function doFormat(obj, depth, indentation) {\r
+                       var i, j, len, childDepth, childIndentation, childLines, expansion,\r
+                               childExpansion;\r
+\r
+                       if (!indentation) {\r
+                               indentation = "";\r
+                       }\r
+\r
+                       function formatString(text) {\r
+                               var lines = splitIntoLines(text);\r
+                               for (var j = 1, jLen = lines.length; j < jLen; j++) {\r
+                                       lines[j] = indentation + lines[j];\r
+                               }\r
+                               return lines.join(newLine);\r
+                       }\r
+\r
+                       if (obj === null) {\r
+                               return "null";\r
+                       } else if (typeof obj == "undefined") {\r
+                               return "undefined";\r
+                       } else if (typeof obj == "string") {\r
+                               return formatString(obj);\r
+                       } else if (typeof obj == "object" && array_contains(objectsExpanded, obj)) {\r
+                               try {\r
+                                       expansion = toStr(obj);\r
+                               } catch (ex) {\r
+                                       expansion = "Error formatting property. Details: " + getExceptionStringRep(ex);\r
+                               }\r
+                               return expansion + " [already expanded]";\r
+                       } else if ((obj instanceof Array) && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "[" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i = 0, len = obj.length; i < len; i++) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + "Error formatting array member. Details: " +\r
+                                                       getExceptionStringRep(ex) + "");\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "]";\r
+                               return expansion;\r
+            } else if (Object.prototype.toString.call(obj) == "[object Date]") {\r
+                return obj.toString();\r
+                       } else if (typeof obj == "object" && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "{" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i in obj) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + i + ": " + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + i + ": Error formatting property. Details: " +\r
+                                                       getExceptionStringRep(ex));\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "}";\r
+                               return expansion;\r
+                       } else {\r
+                               return formatString(toStr(obj));\r
+                       }\r
+               }\r
+               return doFormat(obj, depth, indentation);\r
+       }\r
+       /* ---------------------------------------------------------------------- */\r
+       // Date-related stuff\r
+\r
+       var SimpleDateFormat;\r
+\r
+       (function() {\r
+               var regex = /('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;\r
+               var monthNames = ["January", "February", "March", "April", "May", "June",\r
+                       "July", "August", "September", "October", "November", "December"];\r
+               var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\r
+               var TEXT2 = 0, TEXT3 = 1, NUMBER = 2, YEAR = 3, MONTH = 4, TIMEZONE = 5;\r
+               var types = {\r
+                       G : TEXT2,\r
+                       y : YEAR,\r
+                       M : MONTH,\r
+                       w : NUMBER,\r
+                       W : NUMBER,\r
+                       D : NUMBER,\r
+                       d : NUMBER,\r
+                       F : NUMBER,\r
+                       E : TEXT3,\r
+                       a : TEXT2,\r
+                       H : NUMBER,\r
+                       k : NUMBER,\r
+                       K : NUMBER,\r
+                       h : NUMBER,\r
+                       m : NUMBER,\r
+                       s : NUMBER,\r
+                       S : NUMBER,\r
+                       Z : TIMEZONE\r
+               };\r
+               var ONE_DAY = 24 * 60 * 60 * 1000;\r
+               var ONE_WEEK = 7 * ONE_DAY;\r
+               var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK = 1;\r
+\r
+               var newDateAtMidnight = function(year, month, day) {\r
+                       var d = new Date(year, month, day, 0, 0, 0);\r
+                       d.setMilliseconds(0);\r
+                       return d;\r
+               };\r
+\r
+               Date.prototype.getDifference = function(date) {\r
+                       return this.getTime() - date.getTime();\r
+               };\r
+\r
+               Date.prototype.isBefore = function(d) {\r
+                       return this.getTime() < d.getTime();\r
+               };\r
+\r
+               Date.prototype.getUTCTime = function() {\r
+                       return Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(),\r
+                                       this.getSeconds(), this.getMilliseconds());\r
+               };\r
+\r
+               Date.prototype.getTimeSince = function(d) {\r
+                       return this.getUTCTime() - d.getUTCTime();\r
+               };\r
+\r
+               Date.prototype.getPreviousSunday = function() {\r
+                       // Using midday avoids any possibility of DST messing things up\r
+                       var midday = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 12, 0, 0);\r
+                       var previousSunday = new Date(midday.getTime() - this.getDay() * ONE_DAY);\r
+                       return newDateAtMidnight(previousSunday.getFullYear(), previousSunday.getMonth(),\r
+                                       previousSunday.getDate());\r
+               };\r
+\r
+               Date.prototype.getWeekInYear = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfYear) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfYear) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfYear.getDay();\r
+                       var weekInYear = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek < minimalDaysInFirstWeek) {\r
+                               weekInYear--;\r
+                       }\r
+                       return weekInYear;\r
+               };\r
+\r
+               Date.prototype.getWeekInMonth = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfMonth = newDateAtMidnight(this.getFullYear(), this.getMonth(), 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfMonth) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfMonth) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfMonth.getDay();\r
+                       var weekInMonth = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek >= minimalDaysInFirstWeek) {\r
+                               weekInMonth++;\r
+                       }\r
+                       return weekInMonth;\r
+               };\r
+\r
+               Date.prototype.getDayInYear = function() {\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       return 1 + Math.floor(this.getTimeSince(startOfYear) / ONE_DAY);\r
+               };\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               SimpleDateFormat = function(formatString) {\r
+                       this.formatString = formatString;\r
+               };\r
+\r
+               /**\r
+                * Sets the minimum number of days in a week in order for that week to\r
+                * be considered as belonging to a particular month or year\r
+                */\r
+               SimpleDateFormat.prototype.setMinimalDaysInFirstWeek = function(days) {\r
+                       this.minimalDaysInFirstWeek = days;\r
+               };\r
+\r
+               SimpleDateFormat.prototype.getMinimalDaysInFirstWeek = function() {\r
+                       return isUndefined(this.minimalDaysInFirstWeek) ?\r
+                               DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK : this.minimalDaysInFirstWeek;\r
+               };\r
+\r
+               var padWithZeroes = function(str, len) {\r
+                       while (str.length < len) {\r
+                               str = "0" + str;\r
+                       }\r
+                       return str;\r
+               };\r
+\r
+               var formatText = function(data, numberOfLetters, minLength) {\r
+                       return (numberOfLetters >= 4) ? data : data.substr(0, Math.max(minLength, numberOfLetters));\r
+               };\r
+\r
+               var formatNumber = function(data, numberOfLetters) {\r
+                       var dataString = "" + data;\r
+                       // Pad with 0s as necessary\r
+                       return padWithZeroes(dataString, numberOfLetters);\r
+               };\r
+\r
+               SimpleDateFormat.prototype.format = function(date) {\r
+                       var formattedString = "";\r
+                       var result;\r
+                       var searchString = this.formatString;\r
+                       while ((result = regex.exec(searchString))) {\r
+                               var quotedString = result[1];\r
+                               var patternLetters = result[2];\r
+                               var otherLetters = result[3];\r
+                               var otherCharacters = result[4];\r
+\r
+                               // If the pattern matched is quoted string, output the text between the quotes\r
+                               if (quotedString) {\r
+                                       if (quotedString == "''") {\r
+                                               formattedString += "'";\r
+                                       } else {\r
+                                               formattedString += quotedString.substring(1, quotedString.length - 1);\r
+                                       }\r
+                               } else if (otherLetters) {\r
+                                       // Swallow non-pattern letters by doing nothing here\r
+                               } else if (otherCharacters) {\r
+                                       // Simply output other characters\r
+                                       formattedString += otherCharacters;\r
+                               } else if (patternLetters) {\r
+                                       // Replace pattern letters\r
+                                       var patternLetter = patternLetters.charAt(0);\r
+                                       var numberOfLetters = patternLetters.length;\r
+                                       var rawData = "";\r
+                                       switch(patternLetter) {\r
+                                               case "G":\r
+                                                       rawData = "AD";\r
+                                                       break;\r
+                                               case "y":\r
+                                                       rawData = date.getFullYear();\r
+                                                       break;\r
+                                               case "M":\r
+                                                       rawData = date.getMonth();\r
+                                                       break;\r
+                                               case "w":\r
+                                                       rawData = date.getWeekInYear(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "W":\r
+                                                       rawData = date.getWeekInMonth(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "D":\r
+                                                       rawData = date.getDayInYear();\r
+                                                       break;\r
+                                               case "d":\r
+                                                       rawData = date.getDate();\r
+                                                       break;\r
+                                               case "F":\r
+                                                       rawData = 1 + Math.floor((date.getDate() - 1) / 7);\r
+                                                       break;\r
+                                               case "E":\r
+                                                       rawData = dayNames[date.getDay()];\r
+                                                       break;\r
+                                               case "a":\r
+                                                       rawData = (date.getHours() >= 12) ? "PM" : "AM";\r
+                                                       break;\r
+                                               case "H":\r
+                                                       rawData = date.getHours();\r
+                                                       break;\r
+                                               case "k":\r
+                                                       rawData = date.getHours() || 24;\r
+                                                       break;\r
+                                               case "K":\r
+                                                       rawData = date.getHours() % 12;\r
+                                                       break;\r
+                                               case "h":\r
+                                                       rawData = (date.getHours() % 12) || 12;\r
+                                                       break;\r
+                                               case "m":\r
+                                                       rawData = date.getMinutes();\r
+                                                       break;\r
+                                               case "s":\r
+                                                       rawData = date.getSeconds();\r
+                                                       break;\r
+                                               case "S":\r
+                                                       rawData = date.getMilliseconds();\r
+                                                       break;\r
+                                               case "Z":\r
+                                                       rawData = date.getTimezoneOffset(); // This returns the number of minutes since GMT was this time.\r
+                                                       break;\r
+                                       }\r
+                                       // Format the raw data depending on the type\r
+                                       switch(types[patternLetter]) {\r
+                                               case TEXT2:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 2);\r
+                                                       break;\r
+                                               case TEXT3:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 3);\r
+                                                       break;\r
+                                               case NUMBER:\r
+                                                       formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       break;\r
+                                               case YEAR:\r
+                                                       if (numberOfLetters <= 3) {\r
+                                                               // Output a 2-digit year\r
+                                                               var dataString = "" + rawData;\r
+                                                               formattedString += dataString.substr(2, 2);\r
+                                                       } else {\r
+                                                               formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case MONTH:\r
+                                                       if (numberOfLetters >= 3) {\r
+                                                               formattedString += formatText(monthNames[rawData], numberOfLetters, numberOfLetters);\r
+                                                       } else {\r
+                                                               // NB. Months returned by getMonth are zero-based\r
+                                                               formattedString += formatNumber(rawData + 1, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case TIMEZONE:\r
+                                                       var isPositive = (rawData > 0);\r
+                                                       // The following line looks like a mistake but isn't\r
+                                                       // because of the way getTimezoneOffset measures.\r
+                                                       var prefix = isPositive ? "-" : "+";\r
+                                                       var absData = Math.abs(rawData);\r
+\r
+                                                       // Hours\r
+                                                       var hours = "" + Math.floor(absData / 60);\r
+                                                       hours = padWithZeroes(hours, 2);\r
+                                                       // Minutes\r
+                                                       var minutes = "" + (absData % 60);\r
+                                                       minutes = padWithZeroes(minutes, 2);\r
+\r
+                                                       formattedString += prefix + hours + minutes;\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               searchString = searchString.substr(result.index + result[0].length);\r
+                       }\r
+                       return formattedString;\r
+               };\r
+       })();\r
+\r
+       log4javascript.SimpleDateFormat = SimpleDateFormat;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // PatternLayout\r
+\r
+       function PatternLayout(pattern) {\r
+               if (pattern) {\r
+                       this.pattern = pattern;\r
+               } else {\r
+                       this.pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;\r
+               }\r
+               this.customFields = [];\r
+       }\r
+\r
+       PatternLayout.TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n";\r
+       PatternLayout.DEFAULT_CONVERSION_PATTERN = "%m%n";\r
+       PatternLayout.ISO8601_DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";\r
+       PatternLayout.DATETIME_DATEFORMAT = "dd MMM yyyy HH:mm:ss,SSS";\r
+       PatternLayout.ABSOLUTETIME_DATEFORMAT = "HH:mm:ss,SSS";\r
+\r
+       PatternLayout.prototype = new Layout();\r
+\r
+       PatternLayout.prototype.format = function(loggingEvent) {\r
+               var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;\r
+               var formattedString = "";\r
+               var result;\r
+               var searchString = this.pattern;\r
+\r
+               // Cannot use regex global flag since it doesn't work with exec in IE5\r
+               while ((result = regex.exec(searchString))) {\r
+                       var matchedString = result[0];\r
+                       var padding = result[1];\r
+                       var truncation = result[2];\r
+                       var conversionCharacter = result[3];\r
+                       var specifier = result[5];\r
+                       var text = result[6];\r
+\r
+                       // Check if the pattern matched was just normal text\r
+                       if (text) {\r
+                               formattedString += "" + text;\r
+                       } else {\r
+                               // Create a raw replacement string based on the conversion\r
+                               // character and specifier\r
+                               var replacement = "";\r
+                               switch(conversionCharacter) {\r
+                                       case "a": // Array of messages\r
+                                       case "m": // Message\r
+                                               var depth = 0;\r
+                                               if (specifier) {\r
+                                                       depth = parseInt(specifier, 10);\r
+                                                       if (isNaN(depth)) {\r
+                                                               handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                       specifier + "' for conversion character '" + conversionCharacter +\r
+                                                                       "' - should be a number");\r
+                                                               depth = 0;\r
+                                                       }\r
+                                               }\r
+                                               var messages = (conversionCharacter === "a") ? loggingEvent.messages[0] : loggingEvent.messages;\r
+                                               for (var i = 0, len = messages.length; i < len; i++) {\r
+                                                       if (i > 0 && (replacement.charAt(replacement.length - 1) !== " ")) {\r
+                                                               replacement += " ";\r
+                                                       }\r
+                                                       if (depth === 0) {\r
+                                                               replacement += messages[i];\r
+                                                       } else {\r
+                                                               replacement += formatObjectExpansion(messages[i], depth);\r
+                                                       }\r
+                                               }\r
+                                               break;\r
+                                       case "c": // Logger name\r
+                                               var loggerName = loggingEvent.logger.name;\r
+                                               if (specifier) {\r
+                                                       var precision = parseInt(specifier, 10);\r
+                                                       var loggerNameBits = loggingEvent.logger.name.split(".");\r
+                                                       if (precision >= loggerNameBits.length) {\r
+                                                               replacement = loggerName;\r
+                                                       } else {\r
+                                                               replacement = loggerNameBits.slice(loggerNameBits.length - precision).join(".");\r
+                                                       }\r
+                                               } else {\r
+                                                       replacement = loggerName;\r
+                                               }\r
+                                               break;\r
+                                       case "d": // Date\r
+                                               var dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                               if (specifier) {\r
+                                                       dateFormat = specifier;\r
+                                                       // Pick up special cases\r
+                                                       if (dateFormat == "ISO8601") {\r
+                                                               dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                                       } else if (dateFormat == "ABSOLUTE") {\r
+                                                               dateFormat = PatternLayout.ABSOLUTETIME_DATEFORMAT;\r
+                                                       } else if (dateFormat == "DATE") {\r
+                                                               dateFormat = PatternLayout.DATETIME_DATEFORMAT;\r
+                                                       }\r
+                                               }\r
+                                               // Format the date\r
+                                               replacement = (new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);\r
+                                               break;\r
+                                       case "f": // Custom field\r
+                                               if (this.hasCustomFields()) {\r
+                                                       var fieldIndex = 0;\r
+                                                       if (specifier) {\r
+                                                               fieldIndex = parseInt(specifier, 10);\r
+                                                               if (isNaN(fieldIndex)) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - should be a number");\r
+                                                               } else if (fieldIndex === 0) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - must be greater than zero");\r
+                                                               } else if (fieldIndex > this.customFields.length) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - there aren't that many custom fields");\r
+                                                               } else {\r
+                                                                       fieldIndex = fieldIndex - 1;\r
+                                                               }\r
+                                                       }\r
+                            var val = this.customFields[fieldIndex].value;\r
+                            if (typeof val == "function") {\r
+                                val = val(this, loggingEvent);\r
+                            }\r
+                            replacement = val;\r
+                                               }\r
+                                               break;\r
+                                       case "n": // New line\r
+                                               replacement = newLine;\r
+                                               break;\r
+                                       case "p": // Level\r
+                                               replacement = loggingEvent.level.name;\r
+                                               break;\r
+                                       case "r": // Milliseconds since log4javascript startup\r
+                                               replacement = "" + loggingEvent.timeStamp.getDifference(applicationStartDate);\r
+                                               break;\r
+                                       case "%": // Literal % sign\r
+                                               replacement = "%";\r
+                                               break;\r
+                                       default:\r
+                                               replacement = matchedString;\r
+                                               break;\r
+                               }\r
+                               // Format the replacement according to any padding or\r
+                               // truncation specified\r
+                               var l;\r
+\r
+                               // First, truncation\r
+                               if (truncation) {\r
+                                       l = parseInt(truncation.substr(1), 10);\r
+                                       var strLen = replacement.length;\r
+                                       if (l < strLen) {\r
+                                               replacement = replacement.substring(strLen - l, strLen);\r
+                                       }\r
+                               }\r
+                               // Next, padding\r
+                               if (padding) {\r
+                                       if (padding.charAt(0) == "-") {\r
+                                               l = parseInt(padding.substr(1), 10);\r
+                                               // Right pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement += " ";\r
+                                               }\r
+                                       } else {\r
+                                               l = parseInt(padding, 10);\r
+                                               // Left pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement = " " + replacement;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               formattedString += replacement;\r
+                       }\r
+                       searchString = searchString.substr(result.index + result[0].length);\r
+               }\r
+               return formattedString;\r
+       };\r
+\r
+       PatternLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       PatternLayout.prototype.toString = function() {\r
+           return "PatternLayout";\r
+       };\r
+\r
+       log4javascript.PatternLayout = PatternLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // AlertAppender\r
+\r
+       function AlertAppender() {}\r
+\r
+       AlertAppender.prototype = new Appender();\r
+\r
+       AlertAppender.prototype.layout = new SimpleLayout();\r
+\r
+       AlertAppender.prototype.append = function(loggingEvent) {\r
+               var formattedMessage = this.getLayout().format(loggingEvent);\r
+               if (this.getLayout().ignoresThrowable()) {\r
+                       formattedMessage += loggingEvent.getThrowableStrRep();\r
+               }\r
+               alert(formattedMessage);\r
+       };\r
+\r
+       AlertAppender.prototype.toString = function() {\r
+               return "AlertAppender";\r
+       };\r
+\r
+       log4javascript.AlertAppender = AlertAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // BrowserConsoleAppender (only works in Opera and Safari and Firefox with\r
+       // Firebug extension)\r
+\r
+       function BrowserConsoleAppender() {}\r
+\r
+       BrowserConsoleAppender.prototype = new log4javascript.Appender();\r
+       BrowserConsoleAppender.prototype.layout = new NullLayout();\r
+       BrowserConsoleAppender.prototype.threshold = Level.DEBUG;\r
+\r
+       BrowserConsoleAppender.prototype.append = function(loggingEvent) {\r
+               var appender = this;\r
+\r
+               var getFormattedMessage = function() {\r
+                       var layout = appender.getLayout();\r
+                       var formattedMessage = layout.format(loggingEvent);\r
+                       if (layout.ignoresThrowable() && loggingEvent.exception) {\r
+                               formattedMessage += loggingEvent.getThrowableStrRep();\r
+                       }\r
+                       return formattedMessage;\r
+               };\r
+\r
+               if ((typeof opera != "undefined") && opera.postError) { // Opera\r
+                       opera.postError(getFormattedMessage());\r
+               } else if (window.console && window.console.log) { // Safari and Firebug\r
+                       var formattedMesage = getFormattedMessage();\r
+                       // Log to Firebug using its logging methods or revert to the console.log\r
+                       // method in Safari\r
+                       if (window.console.debug && Level.DEBUG.isGreaterOrEqual(loggingEvent.level)) {\r
+                               window.console.debug(formattedMesage);\r
+                       } else if (window.console.info && Level.INFO.equals(loggingEvent.level)) {\r
+                               window.console.info(formattedMesage);\r
+                       } else if (window.console.warn && Level.WARN.equals(loggingEvent.level)) {\r
+                               window.console.warn(formattedMesage);\r
+                       } else if (window.console.error && loggingEvent.level.isGreaterOrEqual(Level.ERROR)) {\r
+                               window.console.error(formattedMesage);\r
+                       } else {\r
+                               window.console.log(formattedMesage);\r
+                       }\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.group = function(name) {\r
+               if (window.console && window.console.group) {\r
+                       window.console.group(name);\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.groupEnd = function() {\r
+               if (window.console && window.console.groupEnd) {\r
+                       window.console.groupEnd();\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.toString = function() {\r
+               return "BrowserConsoleAppender";\r
+       };\r
+\r
+       log4javascript.BrowserConsoleAppender = BrowserConsoleAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender related\r
+\r
+       var xmlHttpFactories = [\r
+               function() { return new XMLHttpRequest(); },\r
+               function() { return new ActiveXObject("Msxml2.XMLHTTP"); },\r
+               function() { return new ActiveXObject("Microsoft.XMLHTTP"); }\r
+       ];\r
+\r
+       var getXmlHttp = function(errorHandler) {\r
+               // This is only run the first time; the value of getXmlHttp gets\r
+               // replaced with the factory that succeeds on the first run\r
+               var xmlHttp = null, factory;\r
+               for (var i = 0, len = xmlHttpFactories.length; i < len; i++) {\r
+                       factory = xmlHttpFactories[i];\r
+                       try {\r
+                               xmlHttp = factory();\r
+                               getXmlHttp = factory;\r
+                               return xmlHttp;\r
+                       } catch (e) {\r
+                       }\r
+               }\r
+               // If we're here, all factories have failed, so throw an error\r
+               if (errorHandler) {\r
+                       errorHandler();\r
+               } else {\r
+                       handleError("getXmlHttp: unable to obtain XMLHttpRequest object");\r
+               }\r
+       };\r
+\r
+       function isHttpRequestSuccessful(xmlHttp) {\r
+               return isUndefined(xmlHttp.status) || xmlHttp.status === 0 ||\r
+                       (xmlHttp.status >= 200 && xmlHttp.status < 300) ||\r
+                       xmlHttp.status == 1223 /* Fix for IE */;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender\r
+\r
+       function AjaxAppender(url) {\r
+               var appender = this;\r
+               var isSupported = true;\r
+               if (!url) {\r
+                       handleError("AjaxAppender: URL must be specified in constructor");\r
+                       isSupported = false;\r
+               }\r
+\r
+               var timed = this.defaults.timed;\r
+               var waitForResponse = this.defaults.waitForResponse;\r
+               var batchSize = this.defaults.batchSize;\r
+               var timerInterval = this.defaults.timerInterval;\r
+               var requestSuccessCallback = this.defaults.requestSuccessCallback;\r
+               var failCallback = this.defaults.failCallback;\r
+               var postVarName = this.defaults.postVarName;\r
+               var sendAllOnUnload = this.defaults.sendAllOnUnload;\r
+               var contentType = this.defaults.contentType;\r
+               var sessionId = null;\r
+\r
+               var queuedLoggingEvents = [];\r
+               var queuedRequests = [];\r
+               var headers = [];\r
+               var sending = false;\r
+               var initialized = false;\r
+\r
+               // Configuration methods. The function scope is used to prevent\r
+               // direct alteration to the appender configuration properties.\r
+               function checkCanConfigure(configOptionName) {\r
+                       if (initialized) {\r
+                               handleError("AjaxAppender: configuration option '" +\r
+                                       configOptionName +\r
+                                       "' may not be set after the appender has been initialized");\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               this.getSessionId = function() { return sessionId; };\r
+               this.setSessionId = function(sessionIdParam) {\r
+                       sessionId = extractStringFromParam(sessionIdParam, null);\r
+                       this.layout.setCustomField("sessionid", sessionId);\r
+               };\r
+\r
+               this.setLayout = function(layoutParam) {\r
+                       if (checkCanConfigure("layout")) {\r
+                               this.layout = layoutParam;\r
+                               // Set the session id as a custom field on the layout, if not already present\r
+                               if (sessionId !== null) {\r
+                                       this.setSessionId(sessionId);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.isTimed = function() { return timed; };\r
+               this.setTimed = function(timedParam) {\r
+                       if (checkCanConfigure("timed")) {\r
+                               timed = bool(timedParam);\r
+                       }\r
+               };\r
+\r
+               this.getTimerInterval = function() { return timerInterval; };\r
+               this.setTimerInterval = function(timerIntervalParam) {\r
+                       if (checkCanConfigure("timerInterval")) {\r
+                               timerInterval = extractIntFromParam(timerIntervalParam, timerInterval);\r
+                       }\r
+               };\r
+\r
+               this.isWaitForResponse = function() { return waitForResponse; };\r
+               this.setWaitForResponse = function(waitForResponseParam) {\r
+                       if (checkCanConfigure("waitForResponse")) {\r
+                               waitForResponse = bool(waitForResponseParam);\r
+                       }\r
+               };\r
+\r
+               this.getBatchSize = function() { return batchSize; };\r
+               this.setBatchSize = function(batchSizeParam) {\r
+                       if (checkCanConfigure("batchSize")) {\r
+                               batchSize = extractIntFromParam(batchSizeParam, batchSize);\r
+                       }\r
+               };\r
+\r
+               this.isSendAllOnUnload = function() { return sendAllOnUnload; };\r
+               this.setSendAllOnUnload = function(sendAllOnUnloadParam) {\r
+                       if (checkCanConfigure("sendAllOnUnload")) {\r
+                               sendAllOnUnload = extractBooleanFromParam(sendAllOnUnloadParam, sendAllOnUnload);\r
+                       }\r
+               };\r
+\r
+               this.setRequestSuccessCallback = function(requestSuccessCallbackParam) {\r
+                       requestSuccessCallback = extractFunctionFromParam(requestSuccessCallbackParam, requestSuccessCallback);\r
+               };\r
+\r
+               this.setFailCallback = function(failCallbackParam) {\r
+                       failCallback = extractFunctionFromParam(failCallbackParam, failCallback);\r
+               };\r
+\r
+               this.getPostVarName = function() { return postVarName; };\r
+               this.setPostVarName = function(postVarNameParam) {\r
+                       if (checkCanConfigure("postVarName")) {\r
+                               postVarName = extractStringFromParam(postVarNameParam, postVarName);\r
+                       }\r
+               };\r
+\r
+               this.getHeaders = function() { return headers; };\r
+               this.addHeader = function(name, value) {\r
+                       if (name.toLowerCase() == "content-type") {\r
+                               contentType = value;\r
+                       } else {\r
+                               headers.push( { name: name, value: value } );\r
+                       }\r
+               };\r
+\r
+               // Internal functions\r
+               function sendAll() {\r
+                       if (isSupported && enabled) {\r
+                               sending = true;\r
+                               var currentRequestBatch;\r
+                               if (waitForResponse) {\r
+                                       // Send the first request then use this function as the callback once\r
+                                       // the response comes back\r
+                                       if (queuedRequests.length > 0) {\r
+                                               currentRequestBatch = queuedRequests.shift();\r
+                                               sendRequest(preparePostData(currentRequestBatch), sendAll);\r
+                                       } else {\r
+                                               sending = false;\r
+                                               if (timed) {\r
+                                                       scheduleSending();\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       // Rattle off all the requests without waiting to see the response\r
+                                       while ((currentRequestBatch = queuedRequests.shift())) {\r
+                                               sendRequest(preparePostData(currentRequestBatch));\r
+                                       }\r
+                                       sending = false;\r
+                                       if (timed) {\r
+                                               scheduleSending();\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.sendAll = sendAll;\r
+\r
+               // Called when the window unloads. At this point we're past caring about\r
+               // waiting for responses or timers or incomplete batches - everything\r
+               // must go, now\r
+               function sendAllRemaining() {\r
+                       var sendingAnything = false;\r
+                       if (isSupported && enabled) {\r
+                               // Create requests for everything left over, batched as normal\r
+                               var actualBatchSize = appender.getLayout().allowBatching() ? batchSize : 1;\r
+                               var currentLoggingEvent;\r
+                               var batchedLoggingEvents = [];\r
+                               while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                       batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                               // Queue this batch of log entries\r
+                                               queuedRequests.push(batchedLoggingEvents);\r
+                                               batchedLoggingEvents = [];\r
+                                       }\r
+                               }\r
+                               // If there's a partially completed batch, add it\r
+                               if (batchedLoggingEvents.length > 0) {\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+                               }\r
+                               sendingAnything = (queuedRequests.length > 0);\r
+                               waitForResponse = false;\r
+                               timed = false;\r
+                               sendAll();\r
+                       }\r
+                       return sendingAnything;\r
+               }\r
+\r
+               this.sendAllRemaining = sendAllRemaining;\r
+\r
+               function preparePostData(batchedLoggingEvents) {\r
+                       // Format the logging events\r
+                       var formattedMessages = [];\r
+                       var currentLoggingEvent;\r
+                       var postData = "";\r
+                       while ((currentLoggingEvent = batchedLoggingEvents.shift())) {\r
+                               var currentFormattedMessage = appender.getLayout().format(currentLoggingEvent);\r
+                               if (appender.getLayout().ignoresThrowable()) {\r
+                                       currentFormattedMessage += currentLoggingEvent.getThrowableStrRep();\r
+                               }\r
+                               formattedMessages.push(currentFormattedMessage);\r
+                       }\r
+                       // Create the post data string\r
+                       if (batchedLoggingEvents.length == 1) {\r
+                               postData = formattedMessages.join("");\r
+                       } else {\r
+                               postData = appender.getLayout().batchHeader +\r
+                                       formattedMessages.join(appender.getLayout().batchSeparator) +\r
+                                       appender.getLayout().batchFooter;\r
+                       }\r
+                       if (contentType == appender.defaults.contentType) {\r
+                               postData = appender.getLayout().returnsPostData ? postData :\r
+                                       urlEncode(postVarName) + "=" + urlEncode(postData);\r
+                               // Add the layout name to the post data\r
+                               if (postData.length > 0) {\r
+                                       postData += "&";\r
+                               }\r
+                               postData += "layout=" + urlEncode(appender.getLayout().toString());\r
+                       }\r
+                       return postData;\r
+               }\r
+\r
+               function scheduleSending() {\r
+                       window.setTimeout(sendAll, timerInterval);\r
+               }\r
+\r
+               function xmlHttpErrorHandler() {\r
+                       var msg = "AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";\r
+                       handleError(msg);\r
+                       isSupported = false;\r
+                       if (failCallback) {\r
+                               failCallback(msg);\r
+                       }\r
+               }\r
+\r
+               function sendRequest(postData, successCallback) {\r
+                       try {\r
+                               var xmlHttp = getXmlHttp(xmlHttpErrorHandler);\r
+                               if (isSupported) {\r
+                                       if (xmlHttp.overrideMimeType) {\r
+                                               xmlHttp.overrideMimeType(appender.getLayout().getContentType());\r
+                                       }\r
+                                       xmlHttp.onreadystatechange = function() {\r
+                                               if (xmlHttp.readyState == 4) {\r
+                                                       if (isHttpRequestSuccessful(xmlHttp)) {\r
+                                                               if (requestSuccessCallback) {\r
+                                                                       requestSuccessCallback(xmlHttp);\r
+                                                               }\r
+                                                               if (successCallback) {\r
+                                                                       successCallback(xmlHttp);\r
+                                                               }\r
+                                                       } else {\r
+                                                               var msg = "AjaxAppender.append: XMLHttpRequest request to URL " +\r
+                                                                       url + " returned status code " + xmlHttp.status;\r
+                                                               handleError(msg);\r
+                                                               if (failCallback) {\r
+                                                                       failCallback(msg);\r
+                                                               }\r
+                                                       }\r
+                                                       xmlHttp.onreadystatechange = emptyFunction;\r
+                                                       xmlHttp = null;\r
+                                               }\r
+                                       };\r
+                                       xmlHttp.open("POST", url, true);\r
+                                       try {\r
+                                               for (var i = 0, header; header = headers[i++]; ) {\r
+                                                       xmlHttp.setRequestHeader(header.name, header.value);\r
+                                               }\r
+                                               xmlHttp.setRequestHeader("Content-Type", contentType);\r
+                                       } catch (headerEx) {\r
+                                               var msg = "AjaxAppender.append: your browser's XMLHttpRequest implementation" +\r
+                                                       " does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";\r
+                                               handleError(msg);\r
+                                               isSupported = false;\r
+                                               if (failCallback) {\r
+                                                       failCallback(msg);\r
+                                               }\r
+                                               return;\r
+                                       }\r
+                                       xmlHttp.send(postData);\r
+                               }\r
+                       } catch (ex) {\r
+                               var errMsg = "AjaxAppender.append: error sending log message to " + url;\r
+                               handleError(errMsg, ex);\r
+                               isSupported = false;\r
+                               if (failCallback) {\r
+                                       failCallback(errMsg + ". Details: " + getExceptionStringRep(ex));\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.append = function(loggingEvent) {\r
+                       if (isSupported) {\r
+                               if (!initialized) {\r
+                                       init();\r
+                               }\r
+                               queuedLoggingEvents.push(loggingEvent);\r
+                               var actualBatchSize = this.getLayout().allowBatching() ? batchSize : 1;\r
+\r
+                               if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                       var currentLoggingEvent;\r
+                                       var batchedLoggingEvents = [];\r
+                                       while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                               batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       }\r
+                                       // Queue this batch of log entries\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+\r
+                                       // If using a timer, the queue of requests will be processed by the\r
+                                       // timer function, so nothing needs to be done here.\r
+                                       if (!timed && (!waitForResponse || (waitForResponse && !sending))) {\r
+                                               sendAll();\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function init() {\r
+                       initialized = true;\r
+                       // Add unload event to send outstanding messages\r
+                       if (sendAllOnUnload) {\r
+                               var oldBeforeUnload = window.onbeforeunload;\r
+                               window.onbeforeunload = function() {\r
+                                       if (oldBeforeUnload) {\r
+                                               oldBeforeUnload();\r
+                                       }\r
+                                       if (sendAllRemaining()) {\r
+                                               return "Sending log messages";\r
+                                       }\r
+                               };\r
+                       }\r
+                       // Start timer\r
+                       if (timed) {\r
+                               scheduleSending();\r
+                       }\r
+               }\r
+       }\r
+\r
+       AjaxAppender.prototype = new Appender();\r
+\r
+       AjaxAppender.prototype.defaults = {\r
+               waitForResponse: false,\r
+               timed: false,\r
+               timerInterval: 1000,\r
+               batchSize: 1,\r
+               sendAllOnUnload: false,\r
+               requestSuccessCallback: null,\r
+               failCallback: null,\r
+               postVarName: "data",\r
+               contentType: "application/x-www-form-urlencoded"\r
+       };\r
+\r
+       AjaxAppender.prototype.layout = new HttpPostDataLayout();\r
+\r
+       AjaxAppender.prototype.toString = function() {\r
+               return "AjaxAppender";\r
+       };\r
+\r
+       log4javascript.AjaxAppender = AjaxAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // PopUpAppender and InPageAppender related\r
+\r
+       function setCookie(name, value, days, path) {\r
+           var expires;\r
+           path = path ? "; path=" + path : "";\r
+               if (days) {\r
+                       var date = new Date();\r
+                       date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r
+                       expires = "; expires=" + date.toGMTString();\r
+               } else {\r
+                   expires = "";\r
+           }\r
+               document.cookie = escape(name) + "=" + escape(value) + expires + path;\r
+       }\r
+\r
+       function getCookie(name) {\r
+               var nameEquals = escape(name) + "=";\r
+               var ca = document.cookie.split(";");\r
+               for (var i = 0, len = ca.length; i < len; i++) {\r
+                       var c = ca[i];\r
+                       while (c.charAt(0) === " ") {\r
+                           c = c.substring(1, c.length);\r
+                       }\r
+                       if (c.indexOf(nameEquals) === 0) {\r
+                           return unescape(c.substring(nameEquals.length, c.length));\r
+               }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       // Gets the base URL of the location of the log4javascript script.\r
+       // This is far from infallible.\r
+       function getBaseUrl() {\r
+               var scripts = document.getElementsByTagName("script");\r
+               for (var i = 0, len = scripts.length; i < len; ++i) {\r
+                       if (scripts[i].src.indexOf("log4javascript") != -1) {\r
+                               var lastSlash = scripts[i].src.lastIndexOf("/");\r
+                               return (lastSlash == -1) ? "" : scripts[i].src.substr(0, lastSlash + 1);\r
+                       }\r
+               }\r
+        return null;\r
+    }\r
+\r
+       function isLoaded(win) {\r
+               try {\r
+                       return bool(win.loaded);\r
+               } catch (ex) {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // ConsoleAppender (prototype for PopUpAppender and InPageAppender)\r
+\r
+       var ConsoleAppender;\r
+\r
+       // Create an anonymous function to protect base console methods\r
+       (function() {\r
+               var getConsoleHtmlLines = function() {\r
+                       return [\r
+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',\r
+'<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">',\r
+'      <head>',\r
+'              <title>log4javascript</title>',\r
+'              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />',\r
+'              <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->',\r
+'              <meta http-equiv="X-UA-Compatible" content="IE=7" />',\r
+'              <script type="text/javascript">var isIe = false, isIePre7 = false;</script>',\r
+'              <!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->',\r
+'              <!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->',\r
+'              <script type="text/javascript">',\r
+'                      //<![CDATA[',\r
+'                      var loggingEnabled = true;',\r
+'                      var logQueuedEventsTimer = null;',\r
+'                      var logEntries = [];',\r
+'                      var logEntriesAndSeparators = [];',\r
+'                      var logItems = [];',\r
+'                      var renderDelay = 100;',\r
+'                      var unrenderedLogItemsExist = false;',\r
+'                      var rootGroup, currentGroup = null;',\r
+'                      var loaded = false;',\r
+'                      var currentLogItem = null;',\r
+'                      var logMainContainer;',\r
+'',\r
+'                      function copyProperties(obj, props) {',\r
+'                              for (var i in props) {',\r
+'                                      obj[i] = props[i];',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItem() {',\r
+'                      }',\r
+'',\r
+'                      LogItem.prototype = {',\r
+'                              mainContainer: null,',\r
+'                              wrappedContainer: null,',\r
+'                              unwrappedContainer: null,',\r
+'                              group: null,',\r
+'',\r
+'                              appendToLog: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].appendToLog();',\r
+'                                      }',\r
+'                                      this.group.update();',\r
+'                              },',\r
+'',\r
+'                              doRemove: function(doUpdate, removeFromGroup) {',\r
+'                                      if (this.rendered) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].remove();',\r
+'                                              }',\r
+'                                              this.unwrappedElementContainer = null;',\r
+'                                              this.wrappedElementContainer = null;',\r
+'                                              this.mainElementContainer = null;',\r
+'                                      }',\r
+'                                      if (this.group && removeFromGroup) {',\r
+'                                              this.group.removeChild(this, doUpdate);',\r
+'                                      }',\r
+'                                      if (this === currentLogItem) {',\r
+'                                              currentLogItem = null;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function(doUpdate, removeFromGroup) {',\r
+'                                      this.doRemove(doUpdate, removeFromGroup);',\r
+'                              },',\r
+'',\r
+'                              render: function() {},',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visit(this);',\r
+'                              },',\r
+'',\r
+'                              getUnwrappedDomContainer: function() {',\r
+'                                      return this.group.unwrappedElementContainer.contentDiv;',\r
+'                              },',\r
+'',\r
+'                              getWrappedDomContainer: function() {',\r
+'                                      return this.group.wrappedElementContainer.contentDiv;',\r
+'                              },',\r
+'',\r
+'                              getMainDomContainer: function() {',\r
+'                                      return this.group.mainElementContainer.contentDiv;',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      LogItem.serializedItemKeys = {LOG_ENTRY: 0, GROUP_START: 1, GROUP_END: 2};',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemContainerElement() {',\r
+'                      }',\r
+'',\r
+'                      LogItemContainerElement.prototype = {',\r
+'                              appendToLog: function() {',\r
+'                                      var insertBeforeFirst = (newestAtTop && this.containerDomNode.hasChildNodes());',\r
+'                                      if (insertBeforeFirst) {',\r
+'                                              this.containerDomNode.insertBefore(this.mainDiv, this.containerDomNode.firstChild);',\r
+'                                      } else {',\r
+'                                              this.containerDomNode.appendChild(this.mainDiv);',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function SeparatorElementContainer(containerDomNode) {',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "separator";',\r
+'                              this.mainDiv.innerHTML = "&nbsp;";',\r
+'                      }',\r
+'',\r
+'                      SeparatorElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      SeparatorElementContainer.prototype.remove = function() {',\r
+'                              this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                              this.mainDiv = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function Separator() {',\r
+'                              this.rendered = false;',\r
+'                      }',\r
+'',\r
+'                      Separator.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(Separator.prototype, {',\r
+'                              render: function() {',\r
+'                                      var containerDomNode = this.group.contentDiv;',\r
+'                                      if (isIe) {',\r
+'                                              this.unwrappedElementContainer = new SeparatorElementContainer(this.getUnwrappedDomContainer());',\r
+'                                              this.wrappedElementContainer = new SeparatorElementContainer(this.getWrappedDomContainer());',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              this.mainElementContainer = new SeparatorElementContainer(this.getMainDomContainer());',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.content = this.formattedMessage;',\r
+'                                      this.rendered = true;',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function GroupElementContainer(group, containerDomNode, isRoot, isWrapped) {',\r
+'                              this.group = group;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.isRoot = isRoot;',\r
+'                              this.isWrapped = isWrapped;',\r
+'                              this.expandable = false;',\r
+'',\r
+'                              if (this.isRoot) {',\r
+'                                      if (isIe) {',\r
+'                                              this.contentDiv = logMainContainer.appendChild(document.createElement("div"));',\r
+'                                              this.contentDiv.id = this.isWrapped ? "log_wrapped" : "log_unwrapped";',\r
+'                                      } else {',\r
+'                                              this.contentDiv = logMainContainer;',\r
+'                                      }',\r
+'                              } else {',\r
+'                                      var groupElementContainer = this;',\r
+'                                      ',\r
+'                                      this.mainDiv = document.createElement("div");',\r
+'                                      this.mainDiv.className = "group";',\r
+'',\r
+'                                      this.headingDiv = this.mainDiv.appendChild(document.createElement("div"));',\r
+'                                      this.headingDiv.className = "groupheading";',\r
+'',\r
+'                                      this.expander = this.headingDiv.appendChild(document.createElement("span"));',\r
+'                                      this.expander.className = "expander unselectable greyedout";',\r
+'                                      this.expander.unselectable = true;',\r
+'                                      var expanderText = this.group.expanded ? "-" : "+";',\r
+'                                      this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));',\r
+'                                      ',\r
+'                                      this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));',\r
+'',\r
+'                                      this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));',\r
+'                                      var contentCssClass = this.group.expanded ? "expanded" : "collapsed";',\r
+'                                      this.contentDiv.className = "groupcontent " + contentCssClass;',\r
+'',\r
+'                                      this.expander.onclick = function() {',\r
+'                                              if (groupElementContainer.group.expandable) {',\r
+'                                                      groupElementContainer.group.toggleExpanded();',\r
+'                                              }',\r
+'                                      };',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      GroupElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      copyProperties(GroupElementContainer.prototype, {',\r
+'                              toggleExpanded: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              var oldCssClass, newCssClass, expanderText;',\r
+'                                              if (this.group.expanded) {',\r
+'                                                      newCssClass = "expanded";',\r
+'                                                      oldCssClass = "collapsed";',\r
+'                                                      expanderText = "-";',\r
+'                                              } else {',\r
+'                                                      newCssClass = "collapsed";',\r
+'                                                      oldCssClass = "expanded";',\r
+'                                                      expanderText = "+";',\r
+'                                              }',\r
+'                                              replaceClass(this.contentDiv, newCssClass, oldCssClass);',\r
+'                                              this.expanderTextNode.nodeValue = expanderText;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              this.headingDiv = null;',\r
+'                                              this.expander.onclick = null;',\r
+'                                              this.expander = null;',\r
+'                                              this.expanderTextNode = null;',\r
+'                                              this.contentDiv = null;',\r
+'                                              this.containerDomNode = null;',\r
+'                                              this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                                              this.mainDiv = null;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              reverseChildren: function() {',\r
+'                                      // Invert the order of the log entries',\r
+'                                      var node = null;',\r
+'',\r
+'                                      // Remove all the log container nodes',\r
+'                                      var childDomNodes = [];',\r
+'                                      while ((node = this.contentDiv.firstChild)) {',\r
+'                                              this.contentDiv.removeChild(node);',\r
+'                                              childDomNodes.push(node);',\r
+'                                      }',\r
+'',\r
+'                                      // Put them all back in reverse order',\r
+'                                      while ((node = childDomNodes.pop())) {',\r
+'                                              this.contentDiv.appendChild(node);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              update: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              if (this.group.expandable) {',\r
+'                                                      removeClass(this.expander, "greyedout");',\r
+'                                              } else {',\r
+'                                                      addClass(this.expander, "greyedout");',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clear: function() {',\r
+'                                      if (this.isRoot) {',\r
+'                                              this.contentDiv.innerHTML = "";',\r
+'                                      }',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function Group(name, isRoot, initiallyExpanded) {',\r
+'                              this.name = name;',\r
+'                              this.group = null;',\r
+'                              this.isRoot = isRoot;',\r
+'                              this.initiallyExpanded = initiallyExpanded;',\r
+'                              this.elementContainers = [];',\r
+'                              this.children = [];',\r
+'                              this.expanded = initiallyExpanded;',\r
+'                              this.rendered = false;',\r
+'                              this.expandable = false;',\r
+'                      }',\r
+'',\r
+'                      Group.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(Group.prototype, {',\r
+'                              addChild: function(logItem) {',\r
+'                                      this.children.push(logItem);',\r
+'                                      logItem.group = this;',\r
+'                              },',\r
+'',\r
+'                              render: function() {',\r
+'                                      if (isIe) {',\r
+'                                              var unwrappedDomContainer, wrappedDomContainer;',\r
+'                                              if (this.isRoot) {',\r
+'                                                      unwrappedDomContainer = logMainContainer;',\r
+'                                                      wrappedDomContainer = logMainContainer;',\r
+'                                              } else {',\r
+'                                                      unwrappedDomContainer = this.getUnwrappedDomContainer();',\r
+'                                                      wrappedDomContainer = this.getWrappedDomContainer();',\r
+'                                              }',\r
+'                                              this.unwrappedElementContainer = new GroupElementContainer(this, unwrappedDomContainer, this.isRoot, false);',\r
+'                                              this.wrappedElementContainer = new GroupElementContainer(this, wrappedDomContainer, this.isRoot, true);',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              var mainDomContainer = this.isRoot ? logMainContainer : this.getMainDomContainer();',\r
+'                                              this.mainElementContainer = new GroupElementContainer(this, mainDomContainer, this.isRoot, false);',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.rendered = true;',\r
+'                              },',\r
+'',\r
+'                              toggleExpanded: function() {',\r
+'                                      this.expanded = !this.expanded;',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].toggleExpanded();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              expand: function() {',\r
+'                                      if (!this.expanded) {',\r
+'                                              this.toggleExpanded();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visitGroup(this);',\r
+'                              },',\r
+'',\r
+'                              reverseChildren: function() {',\r
+'                                      if (this.rendered) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].reverseChildren();',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              update: function() {',\r
+'                                      var previouslyExpandable = this.expandable;',\r
+'                                      this.expandable = (this.children.length !== 0);',\r
+'                                      if (this.expandable !== previouslyExpandable) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].update();',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              flatten: function() {',\r
+'                                      var visitor = new GroupFlattener();',\r
+'                                      this.accept(visitor);',\r
+'                                      return visitor.logEntriesAndSeparators;',\r
+'                              },',\r
+'',\r
+'                              removeChild: function(child, doUpdate) {',\r
+'                                      array_remove(this.children, child);',\r
+'                                      child.group = null;',\r
+'                                      if (doUpdate) {',\r
+'                                              this.update();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function(doUpdate, removeFromGroup) {',\r
+'                                      for (var i = 0, len = this.children.length; i < len; i++) {',\r
+'                                              this.children[i].remove(false, false);',\r
+'                                      }',\r
+'                                      this.children = [];',\r
+'                                      this.update();',\r
+'                                      if (this === currentGroup) {',\r
+'                                              currentGroup = this.group;',\r
+'                                      }',\r
+'                                      this.doRemove(doUpdate, removeFromGroup);',\r
+'                              },',\r
+'',\r
+'                              serialize: function(items) {',\r
+'                                      items.push([LogItem.serializedItemKeys.GROUP_START, this.name]);',\r
+'                                      for (var i = 0, len = this.children.length; i < len; i++) {',\r
+'                                              this.children[i].serialize(items);',\r
+'                                      }',\r
+'                                      if (this !== currentGroup) {',\r
+'                                              items.push([LogItem.serializedItemKeys.GROUP_END]);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clear: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].clear();',\r
+'                                      }',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryElementContainer() {',\r
+'                      }',\r
+'',\r
+'                      LogEntryElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      copyProperties(LogEntryElementContainer.prototype, {',\r
+'                              remove: function() {',\r
+'                                      this.doRemove();',\r
+'                              },',\r
+'',\r
+'                              doRemove: function() {',\r
+'                                      this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                                      this.mainDiv = null;',\r
+'                                      this.contentElement = null;',\r
+'                                      this.containerDomNode = null;',\r
+'                              },',\r
+'',\r
+'                              setContent: function(content, wrappedContent) {',\r
+'                                      if (content === this.formattedMessage) {',\r
+'                                              this.contentElement.innerHTML = "";',\r
+'                                              this.contentElement.appendChild(document.createTextNode(this.formattedMessage));',\r
+'                                      } else {',\r
+'                                              this.contentElement.innerHTML = content;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              setSearchMatch: function(isMatch) {',\r
+'                                      var oldCssClass = isMatch ? "searchnonmatch" : "searchmatch";',\r
+'                                      var newCssClass = isMatch ? "searchmatch" : "searchnonmatch";',\r
+'                                      replaceClass(this.mainDiv, newCssClass, oldCssClass);',\r
+'                              },',\r
+'',\r
+'                              clearSearch: function() {',\r
+'                                      removeClass(this.mainDiv, "searchmatch");',\r
+'                                      removeClass(this.mainDiv, "searchnonmatch");',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryWrappedElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                              this.mainDiv.className = "logentry wrapped " + this.logEntry.level;',\r
+'                              this.contentElement = this.mainDiv;',\r
+'                      }',\r
+'',\r
+'                      LogEntryWrappedElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      LogEntryWrappedElementContainer.prototype.setContent = function(content, wrappedContent) {',\r
+'                              if (content === this.formattedMessage) {',\r
+'                                      this.contentElement.innerHTML = "";',\r
+'                                      this.contentElement.appendChild(document.createTextNode(this.formattedMessage));',\r
+'                              } else {',\r
+'                                      this.contentElement.innerHTML = wrappedContent;',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryUnwrappedElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "logentry unwrapped " + this.logEntry.level;',\r
+'                              this.pre = this.mainDiv.appendChild(document.createElement("pre"));',\r
+'                              this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                              this.pre.className = "unwrapped";',\r
+'                              this.contentElement = this.pre;',\r
+'                      }',\r
+'',\r
+'                      LogEntryUnwrappedElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      LogEntryUnwrappedElementContainer.prototype.remove = function() {',\r
+'                              this.doRemove();',\r
+'                              this.pre = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryMainElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "logentry nonielogentry " + this.logEntry.level;',\r
+'                              this.contentElement = this.mainDiv.appendChild(document.createElement("span"));',\r
+'                              this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                      }',\r
+'',\r
+'                      LogEntryMainElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntry(level, formattedMessage) {',\r
+'                              this.level = level;',\r
+'                              this.formattedMessage = formattedMessage;',\r
+'                              this.rendered = false;',\r
+'                      }',\r
+'',\r
+'                      LogEntry.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(LogEntry.prototype, {',\r
+'                              render: function() {',\r
+'                                      var logEntry = this;',\r
+'                                      var containerDomNode = this.group.contentDiv;',\r
+'',\r
+'                                      // Support for the CSS attribute white-space in IE for Windows is',\r
+'                                      // non-existent pre version 6 and slightly odd in 6, so instead',\r
+'                                      // use two different HTML elements',\r
+'                                      if (isIe) {',\r
+'                                              this.formattedMessage = this.formattedMessage.replace(/\\r\\n/g, "\\r"); // Workaround for IE\'s treatment of white space',\r
+'                                              this.unwrappedElementContainer = new LogEntryUnwrappedElementContainer(this, this.getUnwrappedDomContainer());',\r
+'                                              this.wrappedElementContainer = new LogEntryWrappedElementContainer(this, this.getWrappedDomContainer());',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              this.mainElementContainer = new LogEntryMainElementContainer(this, this.getMainDomContainer());',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.content = this.formattedMessage;',\r
+'                                      this.rendered = true;',\r
+'                              },',\r
+'',\r
+'                              setContent: function(content, wrappedContent) {',\r
+'                                      if (content != this.content) {',\r
+'                                              if (isIe && (content !== this.formattedMessage)) {',\r
+'                                                      content = content.replace(/\\r\\n/g, "\\r"); // Workaround for IE\'s treatment of white space',\r
+'                                              }',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].setContent(content, wrappedContent);',\r
+'                                              }',\r
+'                                              this.content = content;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              getSearchMatches: function() {',\r
+'                                      var matches = [];',\r
+'                                      var i, len;',\r
+'                                      if (isIe) {',\r
+'                                              var unwrappedEls = getElementsByClass(this.unwrappedElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              var wrappedEls = getElementsByClass(this.wrappedElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              for (i = 0, len = unwrappedEls.length; i < len; i++) {',\r
+'                                                      matches[i] = new Match(this.level, null, unwrappedEls[i], wrappedEls[i]);',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              var els = getElementsByClass(this.mainElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              for (i = 0, len = els.length; i < len; i++) {',\r
+'                                                      matches[i] = new Match(this.level, els[i]);',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return matches;',\r
+'                              },',\r
+'',\r
+'                              setSearchMatch: function(isMatch) {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].setSearchMatch(isMatch);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clearSearch: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].clearSearch();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visitLogEntry(this);',\r
+'                              },',\r
+'',\r
+'                              serialize: function(items) {',\r
+'                                      items.push([LogItem.serializedItemKeys.LOG_ENTRY, this.level, this.formattedMessage]);',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemVisitor() {',\r
+'                      }',\r
+'',\r
+'                      LogItemVisitor.prototype = {',\r
+'                              visit: function(logItem) {',\r
+'                              },',\r
+'',\r
+'                              visitParent: function(logItem) {',\r
+'                                      if (logItem.group) {',\r
+'                                              logItem.group.accept(this);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              visitChildren: function(logItem) {',\r
+'                                      for (var i = 0, len = logItem.children.length; i < len; i++) {',\r
+'                                              logItem.children[i].accept(this);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              visitLogEntry: function(logEntry) {',\r
+'                                      this.visit(logEntry);',\r
+'                              },',\r
+'',\r
+'                              visitSeparator: function(separator) {',\r
+'                                      this.visit(separator);',\r
+'                              },',\r
+'',\r
+'                              visitGroup: function(group) {',\r
+'                                      this.visit(group);',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function GroupFlattener() {',\r
+'                              this.logEntriesAndSeparators = [];',\r
+'                      }',\r
+'',\r
+'                      GroupFlattener.prototype = new LogItemVisitor();',\r
+'',\r
+'                      GroupFlattener.prototype.visitGroup = function(group) {',\r
+'                              this.visitChildren(group);',\r
+'                      };',\r
+'',\r
+'                      GroupFlattener.prototype.visitLogEntry = function(logEntry) {',\r
+'                              this.logEntriesAndSeparators.push(logEntry);',\r
+'                      };',\r
+'',\r
+'                      GroupFlattener.prototype.visitSeparator = function(separator) {',\r
+'                              this.logEntriesAndSeparators.push(separator);',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      window.onload = function() {',\r
+'                              // Sort out document.domain',\r
+'                              if (location.search) {',\r
+'                                      var queryBits = unescape(location.search).substr(1).split("&"), nameValueBits;',\r
+'                                      for (var i = 0, len = queryBits.length; i < len; i++) {',\r
+'                                              nameValueBits = queryBits[i].split("=");',\r
+'                                              if (nameValueBits[0] == "log4javascript_domain") {',\r
+'                                                      document.domain = nameValueBits[1];',\r
+'                                                      break;',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'',\r
+'                              // Create DOM objects',\r
+'                              logMainContainer = $("log");',\r
+'                              if (isIePre7) {',\r
+'                                      addClass(logMainContainer, "oldIe");',\r
+'                              }',\r
+'',\r
+'                              rootGroup = new Group("root", true);',\r
+'                              rootGroup.render();',\r
+'                              currentGroup = rootGroup;',\r
+'                              ',\r
+'                              setCommandInputWidth();',\r
+'                              setLogContainerHeight();',\r
+'                              toggleLoggingEnabled();',\r
+'                              toggleSearchEnabled();',\r
+'                              toggleSearchFilter();',\r
+'                              toggleSearchHighlight();',\r
+'                              applyFilters();',\r
+'                              checkAllLevels();',\r
+'                              toggleWrap();',\r
+'                              toggleNewestAtTop();',\r
+'                              toggleScrollToLatest();',\r
+'                              renderQueuedLogItems();',\r
+'                              loaded = true;',\r
+'                              $("command").value = "";',\r
+'                              $("command").autocomplete = "off";',\r
+'                              $("command").onkeydown = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 10 || evt.keyCode == 13) { // Return/Enter',\r
+'                                              evalCommandLine();',\r
+'                                              stopPropagation(evt);',\r
+'                                      } else if (evt.keyCode == 27) { // Escape',\r
+'                                              this.value = "";',\r
+'                                              this.focus();',\r
+'                                      } else if (evt.keyCode == 38 && commandHistory.length > 0) { // Up',\r
+'                                              currentCommandIndex = Math.max(0, currentCommandIndex - 1);',\r
+'                                              this.value = commandHistory[currentCommandIndex];',\r
+'                                              moveCaretToEnd(this);',\r
+'                                      } else if (evt.keyCode == 40 && commandHistory.length > 0) { // Down',\r
+'                                              currentCommandIndex = Math.min(commandHistory.length - 1, currentCommandIndex + 1);',\r
+'                                              this.value = commandHistory[currentCommandIndex];',\r
+'                                              moveCaretToEnd(this);',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Prevent the keypress moving the caret in Firefox',\r
+'                              $("command").onkeypress = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 38 && commandHistory.length > 0 && evt.preventDefault) { // Up',\r
+'                                              evt.preventDefault();',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Prevent the keyup event blurring the input in Opera',\r
+'                              $("command").onkeyup = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 27 && evt.preventDefault) { // Up',\r
+'                                              evt.preventDefault();',\r
+'                                              this.focus();',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Add document keyboard shortcuts',\r
+'                              document.onkeydown = function keyEventHandler(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      switch (evt.keyCode) {',\r
+'                                              case 69: // Ctrl + shift + E: re-execute last command',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              evalLastCommand();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                              case 75: // Ctrl + shift + K: focus search',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              focusSearch();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                              case 40: // Ctrl + shift + down arrow: focus command line',\r
+'                                              case 76: // Ctrl + shift + L: focus command line',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              focusCommandLine();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Workaround to make sure log div starts at the correct size',\r
+'                              setTimeout(setLogContainerHeight, 20);',\r
+'',\r
+'                              setShowCommandLine(showCommandLine);',\r
+'                              doSearch();',\r
+'                      };',\r
+'',\r
+'                      window.onunload = function() {',\r
+'                              if (mainWindowExists()) {',\r
+'                                      appender.unload();',\r
+'                              }',\r
+'                              appender = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function toggleLoggingEnabled() {',\r
+'                              setLoggingEnabled($("enableLogging").checked);',\r
+'                      }',\r
+'',\r
+'                      function setLoggingEnabled(enable) {',\r
+'                              loggingEnabled = enable;',\r
+'                      }',\r
+'',\r
+'                      var appender = null;',\r
+'',\r
+'                      function setAppender(appenderParam) {',\r
+'                              appender = appenderParam;',\r
+'                      }',\r
+'',\r
+'                      function setShowCloseButton(showCloseButton) {',\r
+'                              $("closeButton").style.display = showCloseButton ? "inline" : "none";',\r
+'                      }',\r
+'',\r
+'                      function setShowHideButton(showHideButton) {',\r
+'                              $("hideButton").style.display = showHideButton ? "inline" : "none";',\r
+'                      }',\r
+'',\r
+'                      var newestAtTop = false;',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemContentReverser() {',\r
+'                      }',\r
+'                      ',\r
+'                      LogItemContentReverser.prototype = new LogItemVisitor();',\r
+'                      ',\r
+'                      LogItemContentReverser.prototype.visitGroup = function(group) {',\r
+'                              group.reverseChildren();',\r
+'                              this.visitChildren(group);',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function setNewestAtTop(isNewestAtTop) {',\r
+'                              var oldNewestAtTop = newestAtTop;',\r
+'                              var i, iLen, j, jLen;',\r
+'                              newestAtTop = Boolean(isNewestAtTop);',\r
+'                              if (oldNewestAtTop != newestAtTop) {',\r
+'                                      var visitor = new LogItemContentReverser();',\r
+'                                      rootGroup.accept(visitor);',\r
+'',\r
+'                                      // Reassemble the matches array',\r
+'                                      if (currentSearch) {',\r
+'                                              var currentMatch = currentSearch.matches[currentMatchIndex];',\r
+'                                              var matchIndex = 0;',\r
+'                                              var matches = [];',\r
+'                                              var actOnLogEntry = function(logEntry) {',\r
+'                                                      var logEntryMatches = logEntry.getSearchMatches();',\r
+'                                                      for (j = 0, jLen = logEntryMatches.length; j < jLen; j++) {',\r
+'                                                              matches[matchIndex] = logEntryMatches[j];',\r
+'                                                              if (currentMatch && logEntryMatches[j].equals(currentMatch)) {',\r
+'                                                                      currentMatchIndex = matchIndex;',\r
+'                                                              }',\r
+'                                                              matchIndex++;',\r
+'                                                      }',\r
+'                                              };',\r
+'                                              if (newestAtTop) {',\r
+'                                                      for (i = logEntries.length - 1; i >= 0; i--) {',\r
+'                                                              actOnLogEntry(logEntries[i]);',\r
+'                                                      }',\r
+'                                              } else {',\r
+'                                                      for (i = 0, iLen = logEntries.length; i < iLen; i++) {',\r
+'                                                              actOnLogEntry(logEntries[i]);',\r
+'                                                      }',\r
+'                                              }',\r
+'                                              currentSearch.matches = matches;',\r
+'                                              if (currentMatch) {',\r
+'                                                      currentMatch.setCurrent();',\r
+'                                              }',\r
+'                                      } else if (scrollToLatest) {',\r
+'                                              doScrollToLatest();',\r
+'                                      }',\r
+'                              }',\r
+'                              $("newestAtTop").checked = isNewestAtTop;',\r
+'                      }',\r
+'',\r
+'                      function toggleNewestAtTop() {',\r
+'                              var isNewestAtTop = $("newestAtTop").checked;',\r
+'                              setNewestAtTop(isNewestAtTop);',\r
+'                      }',\r
+'',\r
+'                      var scrollToLatest = true;',\r
+'',\r
+'                      function setScrollToLatest(isScrollToLatest) {',\r
+'                              scrollToLatest = isScrollToLatest;',\r
+'                              if (scrollToLatest) {',\r
+'                                      doScrollToLatest();',\r
+'                              }',\r
+'                              $("scrollToLatest").checked = isScrollToLatest;',\r
+'                      }',\r
+'',\r
+'                      function toggleScrollToLatest() {',\r
+'                              var isScrollToLatest = $("scrollToLatest").checked;',\r
+'                              setScrollToLatest(isScrollToLatest);',\r
+'                      }',\r
+'',\r
+'                      function doScrollToLatest() {',\r
+'                              var l = logMainContainer;',\r
+'                              if (typeof l.scrollTop != "undefined") {',\r
+'                                      if (newestAtTop) {',\r
+'                                              l.scrollTop = 0;',\r
+'                                      } else {',\r
+'                                              var latestLogEntry = l.lastChild;',\r
+'                                              if (latestLogEntry) {',\r
+'                                                      l.scrollTop = l.scrollHeight;',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var closeIfOpenerCloses = true;',\r
+'',\r
+'                      function setCloseIfOpenerCloses(isCloseIfOpenerCloses) {',\r
+'                              closeIfOpenerCloses = isCloseIfOpenerCloses;',\r
+'                      }',\r
+'',\r
+'                      var maxMessages = null;',\r
+'',\r
+'                      function setMaxMessages(max) {',\r
+'                              maxMessages = max;',\r
+'                              pruneLogEntries();',\r
+'                      }',\r
+'',\r
+'                      var showCommandLine = false;',\r
+'',\r
+'                      function setShowCommandLine(isShowCommandLine) {',\r
+'                              showCommandLine = isShowCommandLine;',\r
+'                              if (loaded) {',\r
+'                                      $("commandLine").style.display = showCommandLine ? "block" : "none";',\r
+'                                      setCommandInputWidth();',\r
+'                                      setLogContainerHeight();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function focusCommandLine() {',\r
+'                              if (loaded) {',\r
+'                                      $("command").focus();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function focusSearch() {',\r
+'                              if (loaded) {',\r
+'                                      $("searchBox").focus();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function getLogItems() {',\r
+'                              var items = [];',\r
+'                              for (var i = 0, len = logItems.length; i < len; i++) {',\r
+'                                      logItems[i].serialize(items);',\r
+'                              }',\r
+'                              return items;',\r
+'                      }',\r
+'',\r
+'                      function setLogItems(items) {',\r
+'                              var loggingReallyEnabled = loggingEnabled;',\r
+'                              // Temporarily turn logging on',\r
+'                              loggingEnabled = true;',\r
+'                              for (var i = 0, len = items.length; i < len; i++) {',\r
+'                                      switch (items[i][0]) {',\r
+'                                              case LogItem.serializedItemKeys.LOG_ENTRY:',\r
+'                                                      log(items[i][1], items[i][2]);',\r
+'                                                      break;',\r
+'                                              case LogItem.serializedItemKeys.GROUP_START:',\r
+'                                                      group(items[i][1]);',\r
+'                                                      break;',\r
+'                                              case LogItem.serializedItemKeys.GROUP_END:',\r
+'                                                      groupEnd();',\r
+'                                                      break;',\r
+'                                      }',\r
+'                              }',\r
+'                              loggingEnabled = loggingReallyEnabled;',\r
+'                      }',\r
+'',\r
+'                      function log(logLevel, formattedMessage) {',\r
+'                              if (loggingEnabled) {',\r
+'                                      var logEntry = new LogEntry(logLevel, formattedMessage);',\r
+'                                      logEntries.push(logEntry);',\r
+'                                      logEntriesAndSeparators.push(logEntry);',\r
+'                                      logItems.push(logEntry);',\r
+'                                      currentGroup.addChild(logEntry);',\r
+'                                      if (loaded) {',\r
+'                                              if (logQueuedEventsTimer !== null) {',\r
+'                                                      clearTimeout(logQueuedEventsTimer);',\r
+'                                              }',\r
+'                                              logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);',\r
+'                                              unrenderedLogItemsExist = true;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function renderQueuedLogItems() {',\r
+'                              logQueuedEventsTimer = null;',\r
+'                              var pruned = pruneLogEntries();',\r
+'',\r
+'                              // Render any unrendered log entries and apply the current search to them',\r
+'                              var initiallyHasMatches = currentSearch ? currentSearch.hasMatches() : false;',\r
+'                              for (var i = 0, len = logItems.length; i < len; i++) {',\r
+'                                      if (!logItems[i].rendered) {',\r
+'                                              logItems[i].render();',\r
+'                                              logItems[i].appendToLog();',\r
+'                                              if (currentSearch && (logItems[i] instanceof LogEntry)) {',\r
+'                                                      currentSearch.applyTo(logItems[i]);',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'                              if (currentSearch) {',\r
+'                                      if (pruned) {',\r
+'                                              if (currentSearch.hasVisibleMatches()) {',\r
+'                                                      if (currentMatchIndex === null) {',\r
+'                                                              setCurrentMatchIndex(0);',\r
+'                                                      }',\r
+'                                                      displayMatches();',\r
+'                                              } else {',\r
+'                                                      displayNoMatches();',\r
+'                                              }',\r
+'                                      } else if (!initiallyHasMatches && currentSearch.hasVisibleMatches()) {',\r
+'                                              setCurrentMatchIndex(0);',\r
+'                                              displayMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                              if (scrollToLatest) {',\r
+'                                      doScrollToLatest();',\r
+'                              }',\r
+'                              unrenderedLogItemsExist = false;',\r
+'                      }',\r
+'',\r
+'                      function pruneLogEntries() {',\r
+'                              if ((maxMessages !== null) && (logEntriesAndSeparators.length > maxMessages)) {',\r
+'                                      var numberToDelete = logEntriesAndSeparators.length - maxMessages;',\r
+'                                      var prunedLogEntries = logEntriesAndSeparators.slice(0, numberToDelete);',\r
+'                                      if (currentSearch) {',\r
+'                                              currentSearch.removeMatches(prunedLogEntries);',\r
+'                                      }',\r
+'                                      var group;',\r
+'                                      for (var i = 0; i < numberToDelete; i++) {',\r
+'                                              group = logEntriesAndSeparators[i].group;',\r
+'                                              array_remove(logItems, logEntriesAndSeparators[i]);',\r
+'                                              array_remove(logEntries, logEntriesAndSeparators[i]);',\r
+'                                              logEntriesAndSeparators[i].remove(true, true);',\r
+'                                              if (group.children.length === 0 && group !== currentGroup && group !== rootGroup) {',\r
+'                                                      array_remove(logItems, group);',\r
+'                                                      group.remove(true, true);',\r
+'                                              }',\r
+'                                      }',\r
+'                                      logEntriesAndSeparators = array_removeFromStart(logEntriesAndSeparators, numberToDelete);',\r
+'                                      return true;',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function group(name, startExpanded) {',\r
+'                              if (loggingEnabled) {',\r
+'                                      initiallyExpanded = (typeof startExpanded === "undefined") ? true : Boolean(startExpanded);',\r
+'                                      var newGroup = new Group(name, false, initiallyExpanded);',\r
+'                                      currentGroup.addChild(newGroup);',\r
+'                                      currentGroup = newGroup;',\r
+'                                      logItems.push(newGroup);',\r
+'                                      if (loaded) {',\r
+'                                              if (logQueuedEventsTimer !== null) {',\r
+'                                                      clearTimeout(logQueuedEventsTimer);',\r
+'                                              }',\r
+'                                              logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);',\r
+'                                              unrenderedLogItemsExist = true;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function groupEnd() {',\r
+'                              currentGroup = (currentGroup === rootGroup) ? rootGroup : currentGroup.group;',\r
+'                      }',\r
+'',\r
+'                      function mainPageReloaded() {',\r
+'                              currentGroup = rootGroup;',\r
+'                              var separator = new Separator();',\r
+'                              logEntriesAndSeparators.push(separator);',\r
+'                              logItems.push(separator);',\r
+'                              currentGroup.addChild(separator);',\r
+'                      }',\r
+'',\r
+'                      function closeWindow() {',\r
+'                              if (appender && mainWindowExists()) {',\r
+'                                      appender.close(true);',\r
+'                              } else {',\r
+'                                      window.close();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function hide() {',\r
+'                              if (appender && mainWindowExists()) {',\r
+'                                      appender.hide();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var mainWindow = window;',\r
+'                      var windowId = "log4javascriptConsoleWindow_" + new Date().getTime() + "_" + ("" + Math.random()).substr(2);',\r
+'',\r
+'                      function setMainWindow(win) {',\r
+'                              mainWindow = win;',\r
+'                              mainWindow[windowId] = window;',\r
+'                              // If this is a pop-up, poll the opener to see if it\'s closed',\r
+'                              if (opener && closeIfOpenerCloses) {',\r
+'                                      pollOpener();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function pollOpener() {',\r
+'                              if (closeIfOpenerCloses) {',\r
+'                                      if (mainWindowExists()) {',\r
+'                                              setTimeout(pollOpener, 500);',\r
+'                                      } else {',\r
+'                                              closeWindow();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function mainWindowExists() {',\r
+'                              try {',\r
+'                                      return (mainWindow && !mainWindow.closed &&',\r
+'                                              mainWindow[windowId] == window);',\r
+'                              } catch (ex) {}',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      var logLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];',\r
+'',\r
+'                      function getCheckBox(logLevel) {',\r
+'                              return $("switch_" + logLevel);',\r
+'                      }',\r
+'',\r
+'                      function getIeWrappedLogContainer() {',\r
+'                              return $("log_wrapped");',\r
+'                      }',\r
+'',\r
+'                      function getIeUnwrappedLogContainer() {',\r
+'                              return $("log_unwrapped");',\r
+'                      }',\r
+'',\r
+'                      function applyFilters() {',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      if (getCheckBox(logLevels[i]).checked) {',\r
+'                                              addClass(logMainContainer, logLevels[i]);',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, logLevels[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                              updateSearchFromFilters();',\r
+'                      }',\r
+'',\r
+'                      function toggleAllLevels() {',\r
+'                              var turnOn = $("switch_ALL").checked;',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      getCheckBox(logLevels[i]).checked = turnOn;',\r
+'                                      if (turnOn) {',\r
+'                                              addClass(logMainContainer, logLevels[i]);',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, logLevels[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function checkAllLevels() {',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      if (!getCheckBox(logLevels[i]).checked) {',\r
+'                                              getCheckBox("ALL").checked = false;',\r
+'                                              return;',\r
+'                                      }',\r
+'                              }',\r
+'                              getCheckBox("ALL").checked = true;',\r
+'                      }',\r
+'',\r
+'                      function clearLog() {',\r
+'                              rootGroup.clear();',\r
+'                              currentGroup = rootGroup;',\r
+'                              logEntries = [];',\r
+'                              logItems = [];',\r
+'                              logEntriesAndSeparators = [];',\r
+'                              doSearch();',\r
+'                      }',\r
+'',\r
+'                      function toggleWrap() {',\r
+'                              var enable = $("wrap").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "wrap");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "wrap");',\r
+'                              }',\r
+'                              refreshCurrentMatch();',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------- */',\r
+'',\r
+'                      // Search',\r
+'',\r
+'                      var searchTimer = null;',\r
+'',\r
+'                      function scheduleSearch() {',\r
+'                              try {',\r
+'                                      clearTimeout(searchTimer);',\r
+'                              } catch (ex) {',\r
+'                                      // Do nothing',\r
+'                              }',\r
+'                              searchTimer = setTimeout(doSearch, 500);',\r
+'                      }',\r
+'',\r
+'                      function Search(searchTerm, isRegex, searchRegex, isCaseSensitive) {',\r
+'                              this.searchTerm = searchTerm;',\r
+'                              this.isRegex = isRegex;',\r
+'                              this.searchRegex = searchRegex;',\r
+'                              this.isCaseSensitive = isCaseSensitive;',\r
+'                              this.matches = [];',\r
+'                      }',\r
+'',\r
+'                      Search.prototype = {',\r
+'                              hasMatches: function() {',\r
+'                                      return this.matches.length > 0;',\r
+'                              },',\r
+'',\r
+'                              hasVisibleMatches: function() {',\r
+'                                      if (this.hasMatches()) {',\r
+'                                              for (var i = 0; i < this.matches.length; i++) {',\r
+'                                                      if (this.matches[i].isVisible()) {',\r
+'                                                              return true;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return false;',\r
+'                              },',\r
+'',\r
+'                              match: function(logEntry) {',\r
+'                                      var entryText = String(logEntry.formattedMessage);',\r
+'                                      var matchesSearch = false;',\r
+'                                      if (this.isRegex) {',\r
+'                                              matchesSearch = this.searchRegex.test(entryText);',\r
+'                                      } else if (this.isCaseSensitive) {',\r
+'                                              matchesSearch = (entryText.indexOf(this.searchTerm) > -1);',\r
+'                                      } else {',\r
+'                                              matchesSearch = (entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);',\r
+'                                      }',\r
+'                                      return matchesSearch;',\r
+'                              },',\r
+'',\r
+'                              getNextVisibleMatchIndex: function() {',\r
+'                                      for (var i = currentMatchIndex + 1; i < this.matches.length; i++) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      // Start again from the first match',\r
+'                                      for (i = 0; i <= currentMatchIndex; i++) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return -1;',\r
+'                              },',\r
+'',\r
+'                              getPreviousVisibleMatchIndex: function() {',\r
+'                                      for (var i = currentMatchIndex - 1; i >= 0; i--) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      // Start again from the last match',\r
+'                                      for (var i = this.matches.length - 1; i >= currentMatchIndex; i--) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return -1;',\r
+'                              },',\r
+'',\r
+'                              applyTo: function(logEntry) {',\r
+'                                      var doesMatch = this.match(logEntry);',\r
+'                                      if (doesMatch) {',\r
+'                                              logEntry.group.expand();',\r
+'                                              logEntry.setSearchMatch(true);',\r
+'                                              var logEntryContent;',\r
+'                                              var wrappedLogEntryContent;',\r
+'                                              var searchTermReplacementStartTag = "<span class=\\\"searchterm\\\">";',\r
+'                                              var searchTermReplacementEndTag = "<" + "/span>";',\r
+'                                              var preTagName = isIe ? "pre" : "span";',\r
+'                                              var preStartTag = "<" + preTagName + " class=\\\"pre\\\">";',\r
+'                                              var preEndTag = "<" + "/" + preTagName + ">";',\r
+'                                              var startIndex = 0;',\r
+'                                              var searchIndex, matchedText, textBeforeMatch;',\r
+'                                              if (this.isRegex) {',\r
+'                                                      var flags = this.isCaseSensitive ? "g" : "gi";',\r
+'                                                      var capturingRegex = new RegExp("(" + this.searchRegex.source + ")", flags);',\r
+'',\r
+'                                                      // Replace the search term with temporary tokens for the start and end tags',\r
+'                                                      var rnd = ("" + Math.random()).substr(2);',\r
+'                                                      var startToken = "%%s" + rnd + "%%";',\r
+'                                                      var endToken = "%%e" + rnd + "%%";',\r
+'                                                      logEntryContent = logEntry.formattedMessage.replace(capturingRegex, startToken + "$1" + endToken);',\r
+'',\r
+'                                                      // Escape the HTML to get rid of angle brackets',\r
+'                                                      logEntryContent = escapeHtml(logEntryContent);',\r
+'',\r
+'                                                      // Substitute the proper HTML back in for the search match',\r
+'                                                      var result;',\r
+'                                                      var searchString = logEntryContent;',\r
+'                                                      logEntryContent = "";',\r
+'                                                      wrappedLogEntryContent = "";',\r
+'                                                      while ((searchIndex = searchString.indexOf(startToken, startIndex)) > -1) {',\r
+'                                                              var endTokenIndex = searchString.indexOf(endToken, searchIndex);',\r
+'                                                              matchedText = searchString.substring(searchIndex + startToken.length, endTokenIndex);',\r
+'                                                              textBeforeMatch = searchString.substring(startIndex, searchIndex);',\r
+'                                                              logEntryContent += preStartTag + textBeforeMatch + preEndTag;',\r
+'                                                              logEntryContent += searchTermReplacementStartTag + preStartTag + matchedText +',\r
+'                                                                      preEndTag + searchTermReplacementEndTag;',\r
+'                                                              if (isIe) {',\r
+'                                                                      wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +',\r
+'                                                                              matchedText + searchTermReplacementEndTag;',\r
+'                                                              }',\r
+'                                                              startIndex = endTokenIndex + endToken.length;',\r
+'                                                      }',\r
+'                                                      logEntryContent += preStartTag + searchString.substr(startIndex) + preEndTag;',\r
+'                                                      if (isIe) {',\r
+'                                                              wrappedLogEntryContent += searchString.substr(startIndex);',\r
+'                                                      }',\r
+'                                              } else {',\r
+'                                                      logEntryContent = "";',\r
+'                                                      wrappedLogEntryContent = "";',\r
+'                                                      var searchTermReplacementLength = searchTermReplacementStartTag.length +',\r
+'                                                              this.searchTerm.length + searchTermReplacementEndTag.length;',\r
+'                                                      var searchTermLength = this.searchTerm.length;',\r
+'                                                      var searchTermLowerCase = this.searchTerm.toLowerCase();',\r
+'                                                      var logTextLowerCase = logEntry.formattedMessage.toLowerCase();',\r
+'                                                      while ((searchIndex = logTextLowerCase.indexOf(searchTermLowerCase, startIndex)) > -1) {',\r
+'                                                              matchedText = escapeHtml(logEntry.formattedMessage.substr(searchIndex, this.searchTerm.length));',\r
+'                                                              textBeforeMatch = escapeHtml(logEntry.formattedMessage.substring(startIndex, searchIndex));',\r
+'                                                              var searchTermReplacement = searchTermReplacementStartTag +',\r
+'                                                                      preStartTag + matchedText + preEndTag + searchTermReplacementEndTag;',\r
+'                                                              logEntryContent += preStartTag + textBeforeMatch + preEndTag + searchTermReplacement;',\r
+'                                                              if (isIe) {',\r
+'                                                                      wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +',\r
+'                                                                              matchedText + searchTermReplacementEndTag;',\r
+'                                                              }',\r
+'                                                              startIndex = searchIndex + searchTermLength;',\r
+'                                                      }',\r
+'                                                      var textAfterLastMatch = escapeHtml(logEntry.formattedMessage.substr(startIndex));',\r
+'                                                      logEntryContent += preStartTag + textAfterLastMatch + preEndTag;',\r
+'                                                      if (isIe) {',\r
+'                                                              wrappedLogEntryContent += textAfterLastMatch;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                              logEntry.setContent(logEntryContent, wrappedLogEntryContent);',\r
+'                                              var logEntryMatches = logEntry.getSearchMatches();',\r
+'                                              this.matches = this.matches.concat(logEntryMatches);',\r
+'                                      } else {',\r
+'                                              logEntry.setSearchMatch(false);',\r
+'                                              logEntry.setContent(logEntry.formattedMessage, logEntry.formattedMessage);',\r
+'                                      }',\r
+'                                      return doesMatch;',\r
+'                              },',\r
+'',\r
+'                              removeMatches: function(logEntries) {',\r
+'                                      var matchesToRemoveCount = 0;',\r
+'                                      var currentMatchRemoved = false;',\r
+'                                      var matchesToRemove = [];',\r
+'                                      var i, iLen, j, jLen;',\r
+'',\r
+'                                      // Establish the list of matches to be removed',\r
+'                                      for (i = 0, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                              for (j = 0, jLen = logEntries.length; j < jLen; j++) {',\r
+'                                                      if (this.matches[i].belongsTo(logEntries[j])) {',\r
+'                                                              matchesToRemove.push(this.matches[i]);',\r
+'                                                              if (i === currentMatchIndex) {',\r
+'                                                                      currentMatchRemoved = true;',\r
+'                                                              }',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'',\r
+'                                      // Set the new current match index if the current match has been deleted',\r
+'                                      // This will be the first match that appears after the first log entry being',\r
+'                                      // deleted, if one exists; otherwise, it\'s the first match overall',\r
+'                                      var newMatch = currentMatchRemoved ? null : this.matches[currentMatchIndex];',\r
+'                                      if (currentMatchRemoved) {',\r
+'                                              for (i = currentMatchIndex, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                                      if (this.matches[i].isVisible() && !array_contains(matchesToRemove, this.matches[i])) {',\r
+'                                                              newMatch = this.matches[i];',\r
+'                                                              break;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'',\r
+'                                      // Remove the matches',\r
+'                                      for (i = 0, iLen = matchesToRemove.length; i < iLen; i++) {',\r
+'                                              array_remove(this.matches, matchesToRemove[i]);',\r
+'                                              matchesToRemove[i].remove();',\r
+'                                      }',\r
+'',\r
+'                                      // Set the new match, if one exists',\r
+'                                      if (this.hasVisibleMatches()) {',\r
+'                                              if (newMatch === null) {',\r
+'                                                      setCurrentMatchIndex(0);',\r
+'                                              } else {',\r
+'                                                      // Get the index of the new match',\r
+'                                                      var newMatchIndex = 0;',\r
+'                                                      for (i = 0, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                                              if (newMatch === this.matches[i]) {',\r
+'                                                                      newMatchIndex = i;',\r
+'                                                                      break;',\r
+'                                                              }',\r
+'                                                      }',\r
+'                                                      setCurrentMatchIndex(newMatchIndex);',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              currentMatchIndex = null;',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      function getPageOffsetTop(el, container) {',\r
+'                              var currentEl = el;',\r
+'                              var y = 0;',\r
+'                              while (currentEl && currentEl != container) {',\r
+'                                      y += currentEl.offsetTop;',\r
+'                                      currentEl = currentEl.offsetParent;',\r
+'                              }',\r
+'                              return y;',\r
+'                      }',\r
+'',\r
+'                      function scrollIntoView(el) {',\r
+'                              var logContainer = logMainContainer;',\r
+'                              // Check if the whole width of the element is visible and centre if not',\r
+'                              if (!$("wrap").checked) {',\r
+'                                      var logContainerLeft = logContainer.scrollLeft;',\r
+'                                      var logContainerRight = logContainerLeft  + logContainer.offsetWidth;',\r
+'                                      var elLeft = el.offsetLeft;',\r
+'                                      var elRight = elLeft + el.offsetWidth;',\r
+'                                      if (elLeft < logContainerLeft || elRight > logContainerRight) {',\r
+'                                              logContainer.scrollLeft = elLeft - (logContainer.offsetWidth - el.offsetWidth) / 2;',\r
+'                                      }',\r
+'                              }',\r
+'                              // Check if the whole height of the element is visible and centre if not',\r
+'                              var logContainerTop = logContainer.scrollTop;',\r
+'                              var logContainerBottom = logContainerTop  + logContainer.offsetHeight;',\r
+'                              var elTop = getPageOffsetTop(el) - getToolBarsHeight();',\r
+'                              var elBottom = elTop + el.offsetHeight;',\r
+'                              if (elTop < logContainerTop || elBottom > logContainerBottom) {',\r
+'                                      logContainer.scrollTop = elTop - (logContainer.offsetHeight - el.offsetHeight) / 2;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function Match(logEntryLevel, spanInMainDiv, spanInUnwrappedPre, spanInWrappedDiv) {',\r
+'                              this.logEntryLevel = logEntryLevel;',\r
+'                              this.spanInMainDiv = spanInMainDiv;',\r
+'                              if (isIe) {',\r
+'                                      this.spanInUnwrappedPre = spanInUnwrappedPre;',\r
+'                                      this.spanInWrappedDiv = spanInWrappedDiv;',\r
+'                              }',\r
+'                              this.mainSpan = isIe ? spanInUnwrappedPre : spanInMainDiv;',\r
+'                      }',\r
+'',\r
+'                      Match.prototype = {',\r
+'                              equals: function(match) {',\r
+'                                      return this.mainSpan === match.mainSpan;',\r
+'                              },',\r
+'',\r
+'                              setCurrent: function() {',\r
+'                                      if (isIe) {',\r
+'                                              addClass(this.spanInUnwrappedPre, "currentmatch");',\r
+'                                              addClass(this.spanInWrappedDiv, "currentmatch");',\r
+'                                              // Scroll the visible one into view',\r
+'                                              var elementToScroll = $("wrap").checked ? this.spanInWrappedDiv : this.spanInUnwrappedPre;',\r
+'                                              scrollIntoView(elementToScroll);',\r
+'                                      } else {',\r
+'                                              addClass(this.spanInMainDiv, "currentmatch");',\r
+'                                              scrollIntoView(this.spanInMainDiv);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              belongsTo: function(logEntry) {',\r
+'                                      if (isIe) {',\r
+'                                              return isDescendant(this.spanInUnwrappedPre, logEntry.unwrappedPre);',\r
+'                                      } else {',\r
+'                                              return isDescendant(this.spanInMainDiv, logEntry.mainDiv);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              setNotCurrent: function() {',\r
+'                                      if (isIe) {',\r
+'                                              removeClass(this.spanInUnwrappedPre, "currentmatch");',\r
+'                                              removeClass(this.spanInWrappedDiv, "currentmatch");',\r
+'                                      } else {',\r
+'                                              removeClass(this.spanInMainDiv, "currentmatch");',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              isOrphan: function() {',\r
+'                                      return isOrphan(this.mainSpan);',\r
+'                              },',\r
+'',\r
+'                              isVisible: function() {',\r
+'                                      return getCheckBox(this.logEntryLevel).checked;',\r
+'                              },',\r
+'',\r
+'                              remove: function() {',\r
+'                                      if (isIe) {',\r
+'                                              this.spanInUnwrappedPre = null;',\r
+'                                              this.spanInWrappedDiv = null;',\r
+'                                      } else {',\r
+'                                              this.spanInMainDiv = null;',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      var currentSearch = null;',\r
+'                      var currentMatchIndex = null;',\r
+'',\r
+'                      function doSearch() {',\r
+'                              var searchBox = $("searchBox");',\r
+'                              var searchTerm = searchBox.value;',\r
+'                              var isRegex = $("searchRegex").checked;',\r
+'                              var isCaseSensitive = $("searchCaseSensitive").checked;',\r
+'                              var i;',\r
+'',\r
+'                              if (searchTerm === "") {',\r
+'                                      $("searchReset").disabled = true;',\r
+'                                      $("searchNav").style.display = "none";',\r
+'                                      removeClass(document.body, "searching");',\r
+'                                      removeClass(searchBox, "hasmatches");',\r
+'                                      removeClass(searchBox, "nomatches");',\r
+'                                      for (i = 0; i < logEntries.length; i++) {',\r
+'                                              logEntries[i].clearSearch();',\r
+'                                              logEntries[i].setContent(logEntries[i].formattedMessage, logEntries[i].formattedMessage);',\r
+'                                      }',\r
+'                                      currentSearch = null;',\r
+'                                      setLogContainerHeight();',\r
+'                              } else {',\r
+'                                      $("searchReset").disabled = false;',\r
+'                                      $("searchNav").style.display = "block";',\r
+'                                      var searchRegex;',\r
+'                                      var regexValid;',\r
+'                                      if (isRegex) {',\r
+'                                              try {',\r
+'                                                      searchRegex = isCaseSensitive ? new RegExp(searchTerm, "g") : new RegExp(searchTerm, "gi");',\r
+'                                                      regexValid = true;',\r
+'                                                      replaceClass(searchBox, "validregex", "invalidregex");',\r
+'                                                      searchBox.title = "Valid regex";',\r
+'                                              } catch (ex) {',\r
+'                                                      regexValid = false;',\r
+'                                                      replaceClass(searchBox, "invalidregex", "validregex");',\r
+'                                                      searchBox.title = "Invalid regex: " + (ex.message ? ex.message : (ex.description ? ex.description : "unknown error"));',\r
+'                                                      return;',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              searchBox.title = "";',\r
+'                                              removeClass(searchBox, "validregex");',\r
+'                                              removeClass(searchBox, "invalidregex");',\r
+'                                      }',\r
+'                                      addClass(document.body, "searching");',\r
+'                                      currentSearch = new Search(searchTerm, isRegex, searchRegex, isCaseSensitive);',\r
+'                                      for (i = 0; i < logEntries.length; i++) {',\r
+'                                              currentSearch.applyTo(logEntries[i]);',\r
+'                                      }',\r
+'                                      setLogContainerHeight();',\r
+'',\r
+'                                      // Highlight the first search match',\r
+'                                      if (currentSearch.hasVisibleMatches()) {',\r
+'                                              setCurrentMatchIndex(0);',\r
+'                                              displayMatches();',\r
+'                                      } else {',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function updateSearchFromFilters() {',\r
+'                              if (currentSearch) {',\r
+'                                      if (currentSearch.hasMatches()) {',\r
+'                                              if (currentMatchIndex === null) {',\r
+'                                                      currentMatchIndex = 0;',\r
+'                                              }',\r
+'                                              var currentMatch = currentSearch.matches[currentMatchIndex];',\r
+'                                              if (currentMatch.isVisible()) {',\r
+'                                                      displayMatches();',\r
+'                                                      setCurrentMatchIndex(currentMatchIndex);',\r
+'                                              } else {',\r
+'                                                      currentMatch.setNotCurrent();',\r
+'                                                      // Find the next visible match, if one exists',\r
+'                                                      var nextVisibleMatchIndex = currentSearch.getNextVisibleMatchIndex();',\r
+'                                                      if (nextVisibleMatchIndex > -1) {',\r
+'                                                              setCurrentMatchIndex(nextVisibleMatchIndex);',\r
+'                                                              displayMatches();',\r
+'                                                      } else {',\r
+'                                                              displayNoMatches();',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function refreshCurrentMatch() {',\r
+'                              if (currentSearch && currentSearch.hasVisibleMatches()) {',\r
+'                                      setCurrentMatchIndex(currentMatchIndex);',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function displayMatches() {',\r
+'                              replaceClass($("searchBox"), "hasmatches", "nomatches");',\r
+'                              $("searchBox").title = "" + currentSearch.matches.length + " matches found";',\r
+'                              $("searchNav").style.display = "block";',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function displayNoMatches() {',\r
+'                              replaceClass($("searchBox"), "nomatches", "hasmatches");',\r
+'                              $("searchBox").title = "No matches found";',\r
+'                              $("searchNav").style.display = "none";',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchEnabled(enable) {',\r
+'                              enable = (typeof enable == "undefined") ? !$("searchDisable").checked : enable;',\r
+'                              $("searchBox").disabled = !enable;',\r
+'                              $("searchReset").disabled = !enable;',\r
+'                              $("searchRegex").disabled = !enable;',\r
+'                              $("searchNext").disabled = !enable;',\r
+'                              $("searchPrevious").disabled = !enable;',\r
+'                              $("searchCaseSensitive").disabled = !enable;',\r
+'                              $("searchNav").style.display = (enable && ($("searchBox").value !== "") &&',\r
+'                                              currentSearch && currentSearch.hasVisibleMatches()) ?',\r
+'                                      "block" : "none";',\r
+'                              if (enable) {',\r
+'                                      removeClass($("search"), "greyedout");',\r
+'                                      addClass(document.body, "searching");',\r
+'                                      if ($("searchHighlight").checked) {',\r
+'                                              addClass(logMainContainer, "searchhighlight");',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, "searchhighlight");',\r
+'                                      }',\r
+'                                      if ($("searchFilter").checked) {',\r
+'                                              addClass(logMainContainer, "searchfilter");',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, "searchfilter");',\r
+'                                      }',\r
+'                                      $("searchDisable").checked = !enable;',\r
+'                              } else {',\r
+'                                      addClass($("search"), "greyedout");',\r
+'                                      removeClass(document.body, "searching");',\r
+'                                      removeClass(logMainContainer, "searchhighlight");',\r
+'                                      removeClass(logMainContainer, "searchfilter");',\r
+'                              }',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchFilter() {',\r
+'                              var enable = $("searchFilter").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "searchfilter");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "searchfilter");',\r
+'                              }',\r
+'                              refreshCurrentMatch();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchHighlight() {',\r
+'                              var enable = $("searchHighlight").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "searchhighlight");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "searchhighlight");',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function clearSearch() {',\r
+'                              $("searchBox").value = "";',\r
+'                              doSearch();',\r
+'                      }',\r
+'',\r
+'                      function searchNext() {',\r
+'                              if (currentSearch !== null && currentMatchIndex !== null) {',\r
+'                                      currentSearch.matches[currentMatchIndex].setNotCurrent();',\r
+'                                      var nextMatchIndex = currentSearch.getNextVisibleMatchIndex();',\r
+'                                      if (nextMatchIndex > currentMatchIndex || confirm("Reached the end of the page. Start from the top?")) {',\r
+'                                              setCurrentMatchIndex(nextMatchIndex);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function searchPrevious() {',\r
+'                              if (currentSearch !== null && currentMatchIndex !== null) {',\r
+'                                      currentSearch.matches[currentMatchIndex].setNotCurrent();',\r
+'                                      var previousMatchIndex = currentSearch.getPreviousVisibleMatchIndex();',\r
+'                                      if (previousMatchIndex < currentMatchIndex || confirm("Reached the start of the page. Continue from the bottom?")) {',\r
+'                                              setCurrentMatchIndex(previousMatchIndex);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function setCurrentMatchIndex(index) {',\r
+'                              currentMatchIndex = index;',\r
+'                              currentSearch.matches[currentMatchIndex].setCurrent();',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------------- */',\r
+'',\r
+'                      // CSS Utilities',\r
+'',\r
+'                      function addClass(el, cssClass) {',\r
+'                              if (!hasClass(el, cssClass)) {',\r
+'                                      if (el.className) {',\r
+'                                              el.className += " " + cssClass;',\r
+'                                      } else {',\r
+'                                              el.className = cssClass;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function hasClass(el, cssClass) {',\r
+'                              if (el.className) {',\r
+'                                      var classNames = el.className.split(" ");',\r
+'                                      return array_contains(classNames, cssClass);',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function removeClass(el, cssClass) {',\r
+'                              if (hasClass(el, cssClass)) {',\r
+'                                      // Rebuild the className property',\r
+'                                      var existingClasses = el.className.split(" ");',\r
+'                                      var newClasses = [];',\r
+'                                      for (var i = 0, len = existingClasses.length; i < len; i++) {',\r
+'                                              if (existingClasses[i] != cssClass) {',\r
+'                                                      newClasses[newClasses.length] = existingClasses[i];',\r
+'                                              }',\r
+'                                      }',\r
+'                                      el.className = newClasses.join(" ");',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function replaceClass(el, newCssClass, oldCssClass) {',\r
+'                              removeClass(el, oldCssClass);',\r
+'                              addClass(el, newCssClass);',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------------- */',\r
+'',\r
+'                      // Other utility functions',\r
+'',\r
+'                      function getElementsByClass(el, cssClass, tagName) {',\r
+'                              var elements = el.getElementsByTagName(tagName);',\r
+'                              var matches = [];',\r
+'                              for (var i = 0, len = elements.length; i < len; i++) {',\r
+'                                      if (hasClass(elements[i], cssClass)) {',\r
+'                                              matches.push(elements[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                              return matches;',\r
+'                      }',\r
+'',\r
+'                      // Syntax borrowed from Prototype library',\r
+'                      function $(id) {',\r
+'                              return document.getElementById(id);',\r
+'                      }',\r
+'',\r
+'                      function isDescendant(node, ancestorNode) {',\r
+'                              while (node != null) {',\r
+'                                      if (node === ancestorNode) {',\r
+'                                              return true;',\r
+'                                      }',\r
+'                                      node = node.parentNode;',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function isOrphan(node) {',\r
+'                              var currentNode = node;',\r
+'                              while (currentNode) {',\r
+'                                      if (currentNode == document.body) {',\r
+'                                              return false;',\r
+'                                      }',\r
+'                                      currentNode = currentNode.parentNode;',\r
+'                              }',\r
+'                              return true;',\r
+'                      }',\r
+'',\r
+'                      function escapeHtml(str) {',\r
+'                              return str.replace(/&/g, "&amp;").replace(/[<]/g, "&lt;").replace(/>/g, "&gt;");',\r
+'                      }',\r
+'',\r
+'                      function getWindowWidth() {',\r
+'                              if (window.innerWidth) {',\r
+'                                      return window.innerWidth;',\r
+'                              } else if (document.documentElement && document.documentElement.clientWidth) {',\r
+'                                      return document.documentElement.clientWidth;',\r
+'                              } else if (document.body) {',\r
+'                                      return document.body.clientWidth;',\r
+'                              }',\r
+'                              return 0;',\r
+'                      }',\r
+'',\r
+'                      function getWindowHeight() {',\r
+'                              if (window.innerHeight) {',\r
+'                                      return window.innerHeight;',\r
+'                              } else if (document.documentElement && document.documentElement.clientHeight) {',\r
+'                                      return document.documentElement.clientHeight;',\r
+'                              } else if (document.body) {',\r
+'                                      return document.body.clientHeight;',\r
+'                              }',\r
+'                              return 0;',\r
+'                      }',\r
+'',\r
+'                      function getToolBarsHeight() {',\r
+'                              return $("switches").offsetHeight;',\r
+'                      }',\r
+'',\r
+'                      function getChromeHeight() {',\r
+'                              var height = getToolBarsHeight();',\r
+'                              if (showCommandLine) {',\r
+'                                      height += $("commandLine").offsetHeight;',\r
+'                              }',\r
+'                              return height;',\r
+'                      }',\r
+'',\r
+'                      function setLogContainerHeight() {',\r
+'                              if (logMainContainer) {',\r
+'                                      var windowHeight = getWindowHeight();',\r
+'                                      $("body").style.height = getWindowHeight() + "px";',\r
+'                                      logMainContainer.style.height = "" +',\r
+'                                              Math.max(0, windowHeight - getChromeHeight()) + "px";',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function setCommandInputWidth() {',\r
+'                              if (showCommandLine) {',\r
+'                                      $("command").style.width = "" + Math.max(0, $("commandLineContainer").offsetWidth -',\r
+'                                              ($("evaluateButton").offsetWidth + 13)) + "px";',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      window.onresize = function() {',\r
+'                              setCommandInputWidth();',\r
+'                              setLogContainerHeight();',\r
+'                      };',\r
+'',\r
+'                      if (!Array.prototype.push) {',\r
+'                              Array.prototype.push = function() {',\r
+'                              for (var i = 0, len = arguments.length; i < len; i++){',\r
+'                                  this[this.length] = arguments[i];',\r
+'                              }',\r
+'                              return this.length;',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.pop) {',\r
+'                              Array.prototype.pop = function() {',\r
+'                                      if (this.length > 0) {',\r
+'                                              var val = this[this.length - 1];',\r
+'                                              this.length = this.length - 1;',\r
+'                                              return val;',\r
+'                                      }',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.shift) {',\r
+'                              Array.prototype.shift = function() {',\r
+'                                      if (this.length > 0) {',\r
+'                                              var firstItem = this[0];',\r
+'                                              for (var i = 0, len = this.length - 1; i < len; i++) {',\r
+'                                                      this[i] = this[i + 1];',\r
+'                                              }',\r
+'                                              this.length = this.length - 1;',\r
+'                                              return firstItem;',\r
+'                                      }',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.splice) {',\r
+'                              Array.prototype.splice = function(startIndex, deleteCount) {',\r
+'                                      var itemsAfterDeleted = this.slice(startIndex + deleteCount);',\r
+'                                      var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);',\r
+'                                      this.length = startIndex;',\r
+'                                      // Copy the arguments into a proper Array object',\r
+'                                      var argumentsArray = [];',\r
+'                                      for (var i = 0, len = arguments.length; i < len; i++) {',\r
+'                                              argumentsArray[i] = arguments[i];',\r
+'                                      }',\r
+'                                      var itemsToAppend = (argumentsArray.length > 2) ?',\r
+'                                              itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;',\r
+'                                      for (i = 0, len = itemsToAppend.length; i < len; i++) {',\r
+'                                              this.push(itemsToAppend[i]);',\r
+'                                      }',\r
+'                                      return itemsDeleted;',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      function array_remove(arr, val) {',\r
+'                              var index = -1;',\r
+'                              for (var i = 0, len = arr.length; i < len; i++) {',\r
+'                                      if (arr[i] === val) {',\r
+'                                              index = i;',\r
+'                                              break;',\r
+'                                      }',\r
+'                              }',\r
+'                              if (index >= 0) {',\r
+'                                      arr.splice(index, 1);',\r
+'                                      return index;',\r
+'                              } else {',\r
+'                                      return false;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function array_removeFromStart(array, numberToRemove) {',\r
+'                              if (Array.prototype.splice) {',\r
+'                                      array.splice(0, numberToRemove);',\r
+'                              } else {',\r
+'                                      for (var i = numberToRemove, len = array.length; i < len; i++) {',\r
+'                                              array[i - numberToRemove] = array[i];',\r
+'                                      }',\r
+'                                      array.length = array.length - numberToRemove;',\r
+'                              }',\r
+'                              return array;',\r
+'                      }',\r
+'',\r
+'                      function array_contains(arr, val) {',\r
+'                              for (var i = 0, len = arr.length; i < len; i++) {',\r
+'                                      if (arr[i] == val) {',\r
+'                                              return true;',\r
+'                                      }',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function getErrorMessage(ex) {',\r
+'                              if (ex.message) {',\r
+'                                      return ex.message;',\r
+'                              } else if (ex.description) {',\r
+'                                      return ex.description;',\r
+'                              }',\r
+'                              return "" + ex;',\r
+'                      }',\r
+'',\r
+'                      function moveCaretToEnd(input) {',\r
+'                              if (input.setSelectionRange) {',\r
+'                                      input.focus();',\r
+'                                      var length = input.value.length;',\r
+'                                      input.setSelectionRange(length, length);',\r
+'                              } else if (input.createTextRange) {',\r
+'                                      var range = input.createTextRange();',\r
+'                                      range.collapse(false);',\r
+'                                      range.select();',\r
+'                              }',\r
+'                              input.focus();',\r
+'                      }',\r
+'',\r
+'                      function stopPropagation(evt) {',\r
+'                              if (evt.stopPropagation) {',\r
+'                                      evt.stopPropagation();',\r
+'                              } else if (typeof evt.cancelBubble != "undefined") {',\r
+'                                      evt.cancelBubble = true;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function getEvent(evt) {',\r
+'                              return evt ? evt : event;',\r
+'                      }',\r
+'',\r
+'                      function getTarget(evt) {',\r
+'                              return evt.target ? evt.target : evt.srcElement;',\r
+'                      }',\r
+'',\r
+'                      function getRelatedTarget(evt) {',\r
+'                              if (evt.relatedTarget) {',\r
+'                                      return evt.relatedTarget;',\r
+'                              } else if (evt.srcElement) {',\r
+'                                      switch(evt.type) {',\r
+'                                              case "mouseover":',\r
+'                                                      return evt.fromElement;',\r
+'                                              case "mouseout":',\r
+'                                                      return evt.toElement;',\r
+'                                              default:',\r
+'                                                      return evt.srcElement;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function cancelKeyEvent(evt) {',\r
+'                              evt.returnValue = false;',\r
+'                              stopPropagation(evt);',\r
+'                      }',\r
+'',\r
+'                      function evalCommandLine() {',\r
+'                              var expr = $("command").value;',\r
+'                              evalCommand(expr);',\r
+'                              $("command").value = "";',\r
+'                      }',\r
+'',\r
+'                      function evalLastCommand() {',\r
+'                              if (lastCommand != null) {',\r
+'                                      evalCommand(lastCommand);',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var lastCommand = null;',\r
+'                      var commandHistory = [];',\r
+'                      var currentCommandIndex = 0;',\r
+'',\r
+'                      function evalCommand(expr) {',\r
+'                              if (appender) {',\r
+'                                      appender.evalCommandAndAppend(expr);',\r
+'                              } else {',\r
+'                                      var prefix = ">>> " + expr + "\\r\\n";',\r
+'                                      try {',\r
+'                                              log("INFO", prefix + eval(expr));',\r
+'                                      } catch (ex) {',\r
+'                                              log("ERROR", prefix + "Error: " + getErrorMessage(ex));',\r
+'                                      }',\r
+'                              }',\r
+'                              // Update command history',\r
+'                              if (expr != commandHistory[commandHistory.length - 1]) {',\r
+'                                      commandHistory.push(expr);',\r
+'                                      // Update the appender',\r
+'                                      if (appender) {',\r
+'                                              appender.storeCommandHistory(commandHistory);',\r
+'                                      }',\r
+'                              }',\r
+'                              currentCommandIndex = (expr == commandHistory[currentCommandIndex]) ? currentCommandIndex + 1 : commandHistory.length;',\r
+'                              lastCommand = expr;',\r
+'                      }',\r
+'                      //]]>',\r
+'              </script>',\r
+'              <style type="text/css">',\r
+'                      body {',\r
+'                              background-color: white;',\r
+'                              color: black;',\r
+'                              padding: 0;',\r
+'                              margin: 0;',\r
+'                              font-family: tahoma, verdana, arial, helvetica, sans-serif;',\r
+'                              overflow: hidden;',\r
+'                      }',\r
+'',\r
+'                      div#switchesContainer input {',\r
+'                              margin-bottom: 0;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar {',\r
+'                              border-top: solid #ffffff 1px;',\r
+'                              border-bottom: solid #aca899 1px;',\r
+'                              background-color: #f1efe7;',\r
+'                              padding: 3px 5px;',\r
+'                              font-size: 68.75%;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar, div#search input {',\r
+'                              font-family: tahoma, verdana, arial, helvetica, sans-serif;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar input.button {',\r
+'                              padding: 0 5px;',\r
+'                              font-size: 100%;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar input.hidden {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#switches input#clearButton {',\r
+'                              margin-left: 20px;',\r
+'                      }',\r
+'',\r
+'                      div#levels label {',\r
+'                              font-weight: bold;',\r
+'                      }',\r
+'',\r
+'                      div#levels label, div#options label {',\r
+'                              margin-right: 5px;',\r
+'                      }',\r
+'',\r
+'                      div#levels label#wrapLabel {',\r
+'                              font-weight: normal;',\r
+'                      }',\r
+'',\r
+'                      div#search label {',\r
+'                              margin-right: 10px;',\r
+'                      }',\r
+'',\r
+'                      div#search label.searchboxlabel {',\r
+'                              margin-right: 0;',\r
+'                      }',\r
+'',\r
+'                      div#search input {',\r
+'                              font-size: 100%;',\r
+'                      }',\r
+'',\r
+'                      div#search input.validregex {',\r
+'                              color: green;',\r
+'                      }',\r
+'',\r
+'                      div#search input.invalidregex {',\r
+'                              color: red;',\r
+'                      }',\r
+'',\r
+'                      div#search input.nomatches {',\r
+'                              color: white;',\r
+'                              background-color: #ff6666;',\r
+'                      }',\r
+'',\r
+'                      div#search input.nomatches {',\r
+'                              color: white;',\r
+'                              background-color: #ff6666;',\r
+'                      }',\r
+'',\r
+'                      div#searchNav {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine input#command {',\r
+'                              font-size: 100%;',\r
+'                              font-family: Courier New, Courier;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine input#evaluateButton {',\r
+'                      }',\r
+'',\r
+'                      *.greyedout {',\r
+'                              color: gray !important;',\r
+'                              border-color: gray !important;',\r
+'                      }',\r
+'',\r
+'                      *.greyedout *.alwaysenabled { color: black; }',\r
+'',\r
+'                      *.unselectable {',\r
+'                              -khtml-user-select: none;',\r
+'                              -moz-user-select: none;',\r
+'                              user-select: none;',\r
+'                      }',\r
+'',\r
+'                      div#log {',\r
+'                              font-family: Courier New, Courier;',\r
+'                              font-size: 75%;',\r
+'                              width: 100%;',\r
+'                              overflow: auto;',\r
+'                              clear: both;',\r
+'                              position: relative;',\r
+'                      }',\r
+'',\r
+'                      div.group {',\r
+'                              border-color: #cccccc;',\r
+'                              border-style: solid;',\r
+'                              border-width: 1px 0 1px 1px;',\r
+'                              overflow: visible;',\r
+'                      }',\r
+'',\r
+'                      div.oldIe div.group, div.oldIe div.group *, div.oldIe *.logentry {',\r
+'                              height: 1%;',\r
+'                      }',\r
+'',\r
+'                      div.group div.groupheading span.expander {',\r
+'                              border: solid black 1px;',\r
+'                              font-family: Courier New, Courier;',\r
+'                              font-size: 0.833em;',\r
+'                              background-color: #eeeeee;',\r
+'                              position: relative;',\r
+'                              top: -1px;',\r
+'                              color: black;',\r
+'                              padding: 0 2px;',\r
+'                              cursor: pointer;',\r
+'                              cursor: hand;',\r
+'                              height: 1%;',\r
+'                      }',\r
+'',\r
+'                      div.group div.groupcontent {',\r
+'                              margin-left: 10px;',\r
+'                              padding-bottom: 2px;',\r
+'                              overflow: visible;',\r
+'                      }',\r
+'',\r
+'                      div.group div.expanded {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div.group div.collapsed {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      *.logentry {',\r
+'                              overflow: visible;',\r
+'                              display: none;',\r
+'                              white-space: pre;',\r
+'                      }',\r
+'',\r
+'                      span.pre {',\r
+'                              white-space: pre;',\r
+'                      }',\r
+'                      ',\r
+'                      pre.unwrapped {',\r
+'                              display: inline !important;',\r
+'                      }',\r
+'',\r
+'                      pre.unwrapped pre.pre, div.wrapped pre.pre {',\r
+'                              display: inline;',\r
+'                      }',\r
+'',\r
+'                      div.wrapped pre.pre {',\r
+'                              white-space: normal;',\r
+'                      }',\r
+'',\r
+'                      div.wrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      body.searching *.logentry span.currentmatch {',\r
+'                              color: white !important;',\r
+'                              background-color: green !important;',\r
+'                      }',\r
+'',\r
+'                      body.searching div.searchhighlight *.logentry span.searchterm {',\r
+'                              color: black;',\r
+'                              background-color: yellow;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry {',\r
+'                              white-space: normal !important;',\r
+'                              border-width: 0 0 1px 0;',\r
+'                              border-color: #dddddd;',\r
+'                              border-style: dotted;',\r
+'                      }',\r
+'',\r
+'                      div.wrap #log_wrapped, #log_unwrapped {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div.wrap #log_unwrapped, #log_wrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry span.pre {',\r
+'                              overflow: visible;',\r
+'                              white-space: normal;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry pre.unwrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry span.wrapped {',\r
+'                              display: inline;',\r
+'                      }',\r
+'',\r
+'                      div.searchfilter *.searchnonmatch {',\r
+'                              display: none !important;',\r
+'                      }',\r
+'',\r
+'                      div#log *.TRACE, label#label_TRACE {',\r
+'                              color: #666666;',\r
+'                      }',\r
+'',\r
+'                      div#log *.DEBUG, label#label_DEBUG {',\r
+'                              color: green;',\r
+'                      }',\r
+'',\r
+'                      div#log *.INFO, label#label_INFO {',\r
+'                              color: #000099;',\r
+'                      }',\r
+'',\r
+'                      div#log *.WARN, label#label_WARN {',\r
+'                              color: #999900;',\r
+'                      }',\r
+'',\r
+'                      div#log *.ERROR, label#label_ERROR {',\r
+'                              color: red;',\r
+'                      }',\r
+'',\r
+'                      div#log *.FATAL, label#label_FATAL {',\r
+'                              color: #660066;',\r
+'                      }',\r
+'',\r
+'                      div.TRACE#log *.TRACE,',\r
+'                      div.DEBUG#log *.DEBUG,',\r
+'                      div.INFO#log *.INFO,',\r
+'                      div.WARN#log *.WARN,',\r
+'                      div.ERROR#log *.ERROR,',\r
+'                      div.FATAL#log *.FATAL {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div#log div.separator {',\r
+'                              background-color: #cccccc;',\r
+'                              margin: 5px 0;',\r
+'                              line-height: 1px;',\r
+'                      }',\r
+'              </style>',\r
+'      </head>',\r
+'',\r
+'      <body id="body">',\r
+'              <div id="switchesContainer">',\r
+'                      <div id="switches">',\r
+'                              <div id="levels" class="toolbar">',\r
+'                                      Filters:',\r
+'                                      <input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>',\r
+'                                      <input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>',\r
+'                                      <input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>',\r
+'                                      <input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>',\r
+'                                      <input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>',\r
+'                                      <input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>',\r
+'                                      <input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>',\r
+'                              </div>',\r
+'                              <div id="search" class="toolbar">',\r
+'                                      <label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />',\r
+'                                      <input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />',\r
+'                                      <input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>',\r
+'                                      <input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>',\r
+'                                      <input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>',\r
+'                                      <div id="searchNav">',\r
+'                                              <input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />',\r
+'                                              <input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />',\r
+'                                              <input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>',\r
+'                                              <input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>',\r
+'                                      </div>',\r
+'                              </div>',\r
+'                              <div id="options" class="toolbar">',\r
+'                                      Options:',\r
+'                                      <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>',\r
+'                                      <input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>',\r
+'                                      <input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>',\r
+'                                      <input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>',\r
+'                                      <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />',\r
+'                                      <input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />',\r
+'                                      <input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />',\r
+'                              </div>',\r
+'                      </div>',\r
+'              </div>',\r
+'              <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>',\r
+'              <div id="commandLine" class="toolbar">',\r
+'                      <div id="commandLineContainer">',\r
+'                              <input type="text" id="command" title="Enter a JavaScript command here and hit return or press \'Evaluate\'" />',\r
+'                              <input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />',\r
+'                      </div>',\r
+'              </div>',\r
+'      </body>',\r
+'</html>',\r
+''\r
+];\r
+               };\r
+\r
+               var defaultCommandLineFunctions = [];\r
+\r
+               ConsoleAppender = function() {};\r
+\r
+               var consoleAppenderIdCounter = 1;\r
+               ConsoleAppender.prototype = new Appender();\r
+\r
+               ConsoleAppender.prototype.create = function(inPage, container,\r
+                               lazyInit, initiallyMinimized, useDocumentWrite, width, height, focusConsoleWindow) {\r
+                       var appender = this;\r
+\r
+                       // Common properties\r
+                       var initialized = false;\r
+                       var consoleWindowCreated = false;\r
+                       var consoleWindowLoaded = false;\r
+                       var consoleClosed = false;\r
+\r
+                       var queuedLoggingEvents = [];\r
+                       var isSupported = true;\r
+                       var consoleAppenderId = consoleAppenderIdCounter++;\r
+\r
+                       // Local variables\r
+                       initiallyMinimized = extractBooleanFromParam(initiallyMinimized, this.defaults.initiallyMinimized);\r
+                       lazyInit = extractBooleanFromParam(lazyInit, this.defaults.lazyInit);\r
+                       useDocumentWrite = extractBooleanFromParam(useDocumentWrite, this.defaults.useDocumentWrite);\r
+                       var newestMessageAtTop = this.defaults.newestMessageAtTop;\r
+                       var scrollToLatestMessage = this.defaults.scrollToLatestMessage;\r
+                       width = width ? width : this.defaults.width;\r
+                       height = height ? height : this.defaults.height;\r
+                       var maxMessages = this.defaults.maxMessages;\r
+                       var showCommandLine = this.defaults.showCommandLine;\r
+                       var commandLineObjectExpansionDepth = this.defaults.commandLineObjectExpansionDepth;\r
+                       var showHideButton = this.defaults.showHideButton;\r
+            var showCloseButton = this.defaults.showCloseButton;\r
+            var showLogEntryDeleteButtons = this.defaults.showLogEntryDeleteButtons;\r
+\r
+                       this.setLayout(this.defaults.layout);\r
+\r
+                       // Functions whose implementations vary between subclasses\r
+                       var init, createWindow, safeToAppend, getConsoleWindow, open;\r
+\r
+                       // Configuration methods. The function scope is used to prevent\r
+                       // direct alteration to the appender configuration properties.\r
+                       var appenderName = inPage ? "InPageAppender" : "PopUpAppender";\r
+                       var checkCanConfigure = function(configOptionName) {\r
+                               if (consoleWindowCreated) {\r
+                                       handleError(appenderName + ": configuration option '" + configOptionName + "' may not be set after the appender has been initialized");\r
+                                       return false;\r
+                               }\r
+                               return true;\r
+                       };\r
+\r
+                       var consoleWindowExists = function() {\r
+                               return (consoleWindowLoaded && isSupported && !consoleClosed);\r
+                       };\r
+\r
+                       this.isNewestMessageAtTop = function() { return newestMessageAtTop; };\r
+                       this.setNewestMessageAtTop = function(newestMessageAtTopParam) {\r
+                               newestMessageAtTop = bool(newestMessageAtTopParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setNewestAtTop(newestMessageAtTop);\r
+                               }\r
+                       };\r
+\r
+                       this.isScrollToLatestMessage = function() { return scrollToLatestMessage; };\r
+                       this.setScrollToLatestMessage = function(scrollToLatestMessageParam) {\r
+                               scrollToLatestMessage = bool(scrollToLatestMessageParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setScrollToLatest(scrollToLatestMessage);\r
+                               }\r
+                       };\r
+\r
+                       this.getWidth = function() { return width; };\r
+                       this.setWidth = function(widthParam) {\r
+                               if (checkCanConfigure("width")) {\r
+                                       width = extractStringFromParam(widthParam, width);\r
+                               }\r
+                       };\r
+\r
+                       this.getHeight = function() { return height; };\r
+                       this.setHeight = function(heightParam) {\r
+                               if (checkCanConfigure("height")) {\r
+                                       height = extractStringFromParam(heightParam, height);\r
+                               }\r
+                       };\r
+\r
+                       this.getMaxMessages = function() { return maxMessages; };\r
+                       this.setMaxMessages = function(maxMessagesParam) {\r
+                               maxMessages = extractIntFromParam(maxMessagesParam, maxMessages);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setMaxMessages(maxMessages);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowCommandLine = function() { return showCommandLine; };\r
+                       this.setShowCommandLine = function(showCommandLineParam) {\r
+                               showCommandLine = bool(showCommandLineParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowCommandLine(showCommandLine);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowHideButton = function() { return showHideButton; };\r
+                       this.setShowHideButton = function(showHideButtonParam) {\r
+                               showHideButton = bool(showHideButtonParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowHideButton(showHideButton);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowCloseButton = function() { return showCloseButton; };\r
+                       this.setShowCloseButton = function(showCloseButtonParam) {\r
+                               showCloseButton = bool(showCloseButtonParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowCloseButton(showCloseButton);\r
+                               }\r
+                       };\r
+\r
+                       this.getCommandLineObjectExpansionDepth = function() { return commandLineObjectExpansionDepth; };\r
+                       this.setCommandLineObjectExpansionDepth = function(commandLineObjectExpansionDepthParam) {\r
+                               commandLineObjectExpansionDepth = extractIntFromParam(commandLineObjectExpansionDepthParam, commandLineObjectExpansionDepth);\r
+                       };\r
+\r
+                       var minimized = initiallyMinimized;\r
+                       this.isInitiallyMinimized = function() { return initiallyMinimized; };\r
+                       this.setInitiallyMinimized = function(initiallyMinimizedParam) {\r
+                               if (checkCanConfigure("initiallyMinimized")) {\r
+                                       initiallyMinimized = bool(initiallyMinimizedParam);\r
+                                       minimized = initiallyMinimized;\r
+                               }\r
+                       };\r
+\r
+                       this.isUseDocumentWrite = function() { return useDocumentWrite; };\r
+                       this.setUseDocumentWrite = function(useDocumentWriteParam) {\r
+                               if (checkCanConfigure("useDocumentWrite")) {\r
+                                       useDocumentWrite = bool(useDocumentWriteParam);\r
+                               }\r
+                       };\r
+\r
+                       // Common methods\r
+                       function QueuedLoggingEvent(loggingEvent, formattedMessage) {\r
+                               this.loggingEvent = loggingEvent;\r
+                               this.levelName = loggingEvent.level.name;\r
+                               this.formattedMessage = formattedMessage;\r
+                       }\r
+\r
+                       QueuedLoggingEvent.prototype.append = function() {\r
+                               getConsoleWindow().log(this.levelName, this.formattedMessage);\r
+                       };\r
+\r
+                       function QueuedGroup(name, initiallyExpanded) {\r
+                               this.name = name;\r
+                               this.initiallyExpanded = initiallyExpanded;\r
+                       }\r
+\r
+                       QueuedGroup.prototype.append = function() {\r
+                               getConsoleWindow().group(this.name, this.initiallyExpanded);\r
+                       };\r
+\r
+                       function QueuedGroupEnd() {}\r
+\r
+                       QueuedGroupEnd.prototype.append = function() {\r
+                               getConsoleWindow().groupEnd();\r
+                       };\r
+\r
+                       var checkAndAppend = function() {\r
+                               // Next line forces a check of whether the window has been closed\r
+                               safeToAppend();\r
+                               if (!initialized) {\r
+                                       init();\r
+                               } else if (consoleClosed && reopenWhenClosed) {\r
+                                       createWindow();\r
+                               }\r
+                               if (safeToAppend()) {\r
+                                       appendQueuedLoggingEvents();\r
+                               }\r
+                       };\r
+\r
+                       this.append = function(loggingEvent) {\r
+                               if (isSupported) {\r
+                                       // Format the message\r
+                                       var formattedMessage = appender.getLayout().format(loggingEvent);\r
+                                       if (this.getLayout().ignoresThrowable()) {\r
+                                               formattedMessage += loggingEvent.getThrowableStrRep();\r
+                                       }\r
+                                       queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent, formattedMessage));\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+            this.group = function(name, initiallyExpanded) {\r
+                               if (isSupported) {\r
+                                       queuedLoggingEvents.push(new QueuedGroup(name, initiallyExpanded));\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+            this.groupEnd = function() {\r
+                               if (isSupported) {\r
+                                       queuedLoggingEvents.push(new QueuedGroupEnd());\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+                       var appendQueuedLoggingEvents = function() {\r
+                               var currentLoggingEvent;\r
+                               while (queuedLoggingEvents.length > 0) {\r
+                                       queuedLoggingEvents.shift().append();\r
+                               }\r
+                               if (focusConsoleWindow) {\r
+                                       getConsoleWindow().focus();\r
+                               }\r
+                       };\r
+\r
+                       this.setAddedToLogger = function(logger) {\r
+                               this.loggers.push(logger);\r
+                               if (enabled && !lazyInit) {\r
+                                       init();\r
+                               }\r
+                       };\r
+\r
+                       this.clear = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().clearLog();\r
+                               }\r
+                               queuedLoggingEvents.length = 0;\r
+                       };\r
+\r
+                       this.focus = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focus();\r
+                               }\r
+                       };\r
+\r
+                       this.focusCommandLine = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focusCommandLine();\r
+                               }\r
+                       };\r
+\r
+                       this.focusSearch = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focusSearch();\r
+                               }\r
+                       };\r
+\r
+                       var commandWindow = window;\r
+\r
+                       this.getCommandWindow = function() { return commandWindow; };\r
+                       this.setCommandWindow = function(commandWindowParam) {\r
+                               commandWindow = commandWindowParam;\r
+                       };\r
+\r
+                       this.executeLastCommand = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().evalLastCommand();\r
+                               }\r
+                       };\r
+\r
+                       var commandLayout = new PatternLayout("%m");\r
+                       this.getCommandLayout = function() { return commandLayout; };\r
+                       this.setCommandLayout = function(commandLayoutParam) {\r
+                               commandLayout = commandLayoutParam;\r
+                       };\r
+\r
+                       this.evalCommandAndAppend = function(expr) {\r
+                               var commandReturnValue = { appendResult: true, isError: false };\r
+                               var commandOutput = "";\r
+                               // Evaluate the command\r
+                               try {\r
+                                       var result, i;\r
+                                       // The next three lines constitute a workaround for IE. Bizarrely, iframes seem to have no\r
+                                       // eval method on the window object initially, but once execScript has been called on\r
+                                       // it once then the eval method magically appears. See http://www.thismuchiknow.co.uk/?p=25\r
+                                       if (!commandWindow.eval && commandWindow.execScript) {\r
+                                               commandWindow.execScript("null");\r
+                                       }\r
+\r
+                                       var commandLineFunctionsHash = {};\r
+                                       for (i = 0, len = commandLineFunctions.length; i < len; i++) {\r
+                                               commandLineFunctionsHash[commandLineFunctions[i][0]] = commandLineFunctions[i][1];\r
+                                       }\r
+\r
+                                       // Keep an array of variables that are being changed in the command window so that they\r
+                                       // can be restored to their original values afterwards\r
+                                       var objectsToRestore = [];\r
+                                       var addObjectToRestore = function(name) {\r
+                                               objectsToRestore.push([name, commandWindow[name]]);\r
+                                       };\r
+\r
+                                       addObjectToRestore("appender");\r
+                                       commandWindow.appender = appender;\r
+\r
+                                       addObjectToRestore("commandReturnValue");\r
+                                       commandWindow.commandReturnValue = commandReturnValue;\r
+\r
+                                       addObjectToRestore("commandLineFunctionsHash");\r
+                                       commandWindow.commandLineFunctionsHash = commandLineFunctionsHash;\r
+\r
+                                       var addFunctionToWindow = function(name) {\r
+                                               addObjectToRestore(name);\r
+                                               commandWindow[name] = function() {\r
+                                                       return this.commandLineFunctionsHash[name](appender, arguments, commandReturnValue);\r
+                                               };\r
+                                       };\r
+\r
+                                       for (i = 0, len = commandLineFunctions.length; i < len; i++) {\r
+                                               addFunctionToWindow(commandLineFunctions[i][0]);\r
+                                       }\r
+\r
+                                       // Another bizarre workaround to get IE to eval in the global scope\r
+                                       if (commandWindow === window && commandWindow.execScript) {\r
+                                               addObjectToRestore("evalExpr");\r
+                                               addObjectToRestore("result");\r
+                                               window.evalExpr = expr;\r
+                                               commandWindow.execScript("window.result=eval(window.evalExpr);");\r
+                                               result = window.result;\r
+                                       } else {\r
+                                               result = commandWindow.eval(expr);\r
+                                       }\r
+                                       commandOutput = isUndefined(result) ? result : formatObjectExpansion(result, commandLineObjectExpansionDepth);\r
+\r
+                                       // Restore variables in the command window to their original state\r
+                                       for (i = 0, len = objectsToRestore.length; i < len; i++) {\r
+                                               commandWindow[objectsToRestore[i][0]] = objectsToRestore[i][1];\r
+                                       }\r
+                               } catch (ex) {\r
+                                       commandOutput = "Error evaluating command: " + getExceptionStringRep(ex);\r
+                                       commandReturnValue.isError = true;\r
+                               }\r
+                               // Append command output\r
+                               if (commandReturnValue.appendResult) {\r
+                                       var message = ">>> " + expr;\r
+                                       if (!isUndefined(commandOutput)) {\r
+                                               message += newLine + commandOutput;\r
+                                       }\r
+                                       var level = commandReturnValue.isError ? Level.ERROR : Level.INFO;\r
+                                       var loggingEvent = new LoggingEvent(null, new Date(), level, [message], null);\r
+                                       var mainLayout = this.getLayout();\r
+                                       this.setLayout(commandLayout);\r
+                                       this.append(loggingEvent);\r
+                                       this.setLayout(mainLayout);\r
+                               }\r
+                       };\r
+\r
+                       var commandLineFunctions = defaultCommandLineFunctions.concat([]);\r
+\r
+                       this.addCommandLineFunction = function(functionName, commandLineFunction) {\r
+                               commandLineFunctions.push([functionName, commandLineFunction]);\r
+                       };\r
+\r
+                       var commandHistoryCookieName = "log4javascriptCommandHistory";\r
+                       this.storeCommandHistory = function(commandHistory) {\r
+                               setCookie(commandHistoryCookieName, commandHistory.join(","));\r
+                       };\r
+\r
+                       var writeHtml = function(doc) {\r
+                               var lines = getConsoleHtmlLines();\r
+                               doc.open();\r
+                               for (var i = 0, len = lines.length; i < len; i++) {\r
+                                       doc.writeln(lines[i]);\r
+                               }\r
+                               doc.close();\r
+                       };\r
+\r
+                       // Set up event listeners\r
+                       this.setEventTypes(["load", "unload"]);\r
+\r
+                       var consoleWindowLoadHandler = function() {\r
+                               var win = getConsoleWindow();\r
+                               win.setAppender(appender);\r
+                               win.setNewestAtTop(newestMessageAtTop);\r
+                               win.setScrollToLatest(scrollToLatestMessage);\r
+                               win.setMaxMessages(maxMessages);\r
+                               win.setShowCommandLine(showCommandLine);\r
+                               win.setShowHideButton(showHideButton);\r
+                               win.setShowCloseButton(showCloseButton);\r
+                               win.setMainWindow(window);\r
+\r
+                               // Restore command history stored in cookie\r
+                               var storedValue = getCookie(commandHistoryCookieName);\r
+                               if (storedValue) {\r
+                                       win.commandHistory = storedValue.split(",");\r
+                                       win.currentCommandIndex = win.commandHistory.length;\r
+                               }\r
+\r
+                               appender.dispatchEvent("load", { "win" : win });\r
+                       };\r
+\r
+                       this.unload = function() {\r
+                               logLog.debug("unload " + this + ", caller: " + this.unload.caller);\r
+                               if (!consoleClosed) {\r
+                                       logLog.debug("really doing unload " + this);\r
+                                       consoleClosed = true;\r
+                                       consoleWindowLoaded = false;\r
+                                       consoleWindowCreated = false;\r
+                                       appender.dispatchEvent("unload", {});\r
+                               }\r
+                       };\r
+\r
+                       var pollConsoleWindow = function(windowTest, interval, successCallback, errorMessage) {\r
+                               function doPoll() {\r
+                                       try {\r
+                                               // Test if the console has been closed while polling\r
+                                               if (consoleClosed) {\r
+                                                       clearInterval(poll);\r
+                                               }\r
+                                               if (windowTest(getConsoleWindow())) {\r
+                                                       clearInterval(poll);\r
+                                                       successCallback();\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               clearInterval(poll);\r
+                                               isSupported = false;\r
+                                               handleError(errorMessage, ex);\r
+                                       }\r
+                               }\r
+\r
+                               // Poll the pop-up since the onload event is not reliable\r
+                               var poll = setInterval(doPoll, interval);\r
+                       };\r
+\r
+                       var getConsoleUrl = function() {\r
+                               var documentDomainSet = (document.domain != location.hostname);\r
+                               return useDocumentWrite ? "" : getBaseUrl() + "console_uncompressed.html" +\r
+                                                                                          (documentDomainSet ? "?log4javascript_domain=" + escape(document.domain) : "");\r
+                       };\r
+\r
+                       // Define methods and properties that vary between subclasses\r
+                       if (inPage) {\r
+                               // InPageAppender\r
+\r
+                               var containerElement = null;\r
+\r
+                               // Configuration methods. The function scope is used to prevent\r
+                               // direct alteration to the appender configuration properties.\r
+                               var cssProperties = [];\r
+                               this.addCssProperty = function(name, value) {\r
+                                       if (checkCanConfigure("cssProperties")) {\r
+                                               cssProperties.push([name, value]);\r
+                                       }\r
+                               };\r
+\r
+                               // Define useful variables\r
+                               var windowCreationStarted = false;\r
+                               var iframeContainerDiv;\r
+                               var iframeId = uniqueId + "_InPageAppender_" + consoleAppenderId;\r
+\r
+                               this.hide = function() {\r
+                                       if (initialized && consoleWindowCreated) {\r
+                                               if (consoleWindowExists()) {\r
+                                                       getConsoleWindow().$("command").blur();\r
+                                               }\r
+                                               iframeContainerDiv.style.display = "none";\r
+                                               minimized = true;\r
+                                       }\r
+                               };\r
+\r
+                               this.show = function() {\r
+                                       if (initialized) {\r
+                                               if (consoleWindowCreated) {\r
+                                                       iframeContainerDiv.style.display = "block";\r
+                                                       this.setShowCommandLine(showCommandLine); // Force IE to update\r
+                                                       minimized = false;\r
+                                               } else if (!windowCreationStarted) {\r
+                                                       createWindow(true);\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               this.isVisible = function() {\r
+                                       return !minimized && !consoleClosed;\r
+                               };\r
+\r
+                               this.close = function(fromButton) {\r
+                                       if (!consoleClosed && (!fromButton || confirm("This will permanently remove the console from the page. No more messages will be logged. Do you wish to continue?"))) {\r
+                                               iframeContainerDiv.parentNode.removeChild(iframeContainerDiv);\r
+                                               this.unload();\r
+                                       }\r
+                               };\r
+\r
+                               // Create open, init, getConsoleWindow and safeToAppend functions\r
+                               open = function() {\r
+                                       var initErrorMessage = "InPageAppender.open: unable to create console iframe";\r
+\r
+                                       function finalInit() {\r
+                                               try {\r
+                                                       if (!initiallyMinimized) {\r
+                                                               appender.show();\r
+                                                       }\r
+                                                       consoleWindowLoadHandler();\r
+                                                       consoleWindowLoaded = true;\r
+                                                       appendQueuedLoggingEvents();\r
+                                               } catch (ex) {\r
+                                                       isSupported = false;\r
+                                                       handleError(initErrorMessage, ex);\r
+                                               }\r
+                                       }\r
+\r
+                                       function writeToDocument() {\r
+                                               try {\r
+                                                       var windowTest = function(win) { return isLoaded(win); };\r
+                                                       if (useDocumentWrite) {\r
+                                                               writeHtml(getConsoleWindow().document);\r
+                                                       }\r
+                                                       if (windowTest(getConsoleWindow())) {\r
+                                                               finalInit();\r
+                                                       } else {\r
+                                                               pollConsoleWindow(windowTest, 100, finalInit, initErrorMessage);\r
+                                                       }\r
+                                               } catch (ex) {\r
+                                                       isSupported = false;\r
+                                                       handleError(initErrorMessage, ex);\r
+                                               }\r
+                                       }\r
+\r
+                                       minimized = false;\r
+                                       iframeContainerDiv = containerElement.appendChild(document.createElement("div"));\r
+\r
+                                       iframeContainerDiv.style.width = width;\r
+                                       iframeContainerDiv.style.height = height;\r
+                                       iframeContainerDiv.style.border = "solid gray 1px";\r
+\r
+                                       for (var i = 0, len = cssProperties.length; i < len; i++) {\r
+                                               iframeContainerDiv.style[cssProperties[i][0]] = cssProperties[i][1];\r
+                                       }\r
+\r
+                                       var iframeSrc = useDocumentWrite ? "" : " src='" + getConsoleUrl() + "'";\r
+\r
+                                       // Adding an iframe using the DOM would be preferable, but it doesn't work\r
+                                       // in IE5 on Windows, or in Konqueror prior to version 3.5 - in Konqueror\r
+                                       // it creates the iframe fine but I haven't been able to find a way to obtain\r
+                                       // the iframe's window object\r
+                                       iframeContainerDiv.innerHTML = "<iframe id='" + iframeId + "' name='" + iframeId +\r
+                                               "' width='100%' height='100%' frameborder='0'" + iframeSrc +\r
+                                               " scrolling='no'></iframe>";\r
+                                       consoleClosed = false;\r
+\r
+                                       // Write the console HTML to the iframe\r
+                                       var iframeDocumentExistsTest = function(win) {\r
+                                               try {\r
+                                                       return bool(win) && bool(win.document);\r
+                                               } catch (ex) {\r
+                                                       return false;\r
+                                               }\r
+                                       };\r
+                                       if (iframeDocumentExistsTest(getConsoleWindow())) {\r
+                                               writeToDocument();\r
+                                       } else {\r
+                                               pollConsoleWindow(iframeDocumentExistsTest, 100, writeToDocument, initErrorMessage);\r
+                                       }\r
+                                       consoleWindowCreated = true;\r
+                               };\r
+\r
+                               createWindow = function(show) {\r
+                                       if (show || !initiallyMinimized) {\r
+                                               var pageLoadHandler = function() {\r
+                                                       if (!container) {\r
+                                                               // Set up default container element\r
+                                                               containerElement = document.createElement("div");\r
+                                                               containerElement.style.position = "fixed";\r
+                                                               containerElement.style.left = "0";\r
+                                                               containerElement.style.right = "0";\r
+                                                               containerElement.style.bottom = "0";\r
+                                                               document.body.appendChild(containerElement);\r
+                                                               appender.addCssProperty("borderWidth", "1px 0 0 0");\r
+                                                               appender.addCssProperty("zIndex", 1000000); // Can't find anything authoritative that says how big z-index can be\r
+                                                               open();\r
+                                                       } else {\r
+                                                               try {\r
+                                                                       var el = document.getElementById(container);\r
+                                                                       if (el.nodeType == 1) {\r
+                                                                               containerElement = el;\r
+                                                                       }\r
+                                                                       open();\r
+                                                               } catch (ex) {\r
+                                                                       handleError("InPageAppender.init: invalid container element '" + container + "' supplied", ex);\r
+                                                               }\r
+                                                       }\r
+                                               };\r
+\r
+                                               // Test the type of the container supplied. First, check if it's an element\r
+                                               if (pageLoaded && container && container.appendChild) {\r
+                                                       containerElement = container;\r
+                                                       open();\r
+                                               } else if (pageLoaded) {\r
+                                                       pageLoadHandler();\r
+                                               } else {\r
+                                                       log4javascript.addEventListener("load", pageLoadHandler);\r
+                                               }\r
+                                               windowCreationStarted = true;\r
+                                       }\r
+                               };\r
+\r
+                               init = function() {\r
+                                       createWindow();\r
+                                       initialized = true;\r
+                               };\r
+\r
+                               getConsoleWindow = function() {\r
+                                       var iframe = window.frames[iframeId];\r
+                                       if (iframe) {\r
+                                               return iframe;\r
+                                       }\r
+                               };\r
+\r
+                               safeToAppend = function() {\r
+                                       if (isSupported && !consoleClosed) {\r
+                                               if (consoleWindowCreated && !consoleWindowLoaded && getConsoleWindow() && isLoaded(getConsoleWindow())) {\r
+                                                       consoleWindowLoaded = true;\r
+                                               }\r
+                                               return consoleWindowLoaded;\r
+                                       }\r
+                                       return false;\r
+                               };\r
+                       } else {\r
+                               // PopUpAppender\r
+\r
+                               // Extract params\r
+                               var useOldPopUp = appender.defaults.useOldPopUp;\r
+                               var complainAboutPopUpBlocking = appender.defaults.complainAboutPopUpBlocking;\r
+                               var reopenWhenClosed = this.defaults.reopenWhenClosed;\r
+\r
+                               // Configuration methods. The function scope is used to prevent\r
+                               // direct alteration to the appender configuration properties.\r
+                               this.isUseOldPopUp = function() { return useOldPopUp; };\r
+                               this.setUseOldPopUp = function(useOldPopUpParam) {\r
+                                       if (checkCanConfigure("useOldPopUp")) {\r
+                                               useOldPopUp = bool(useOldPopUpParam);\r
+                                       }\r
+                               };\r
+\r
+                               this.isComplainAboutPopUpBlocking = function() { return complainAboutPopUpBlocking; };\r
+                               this.setComplainAboutPopUpBlocking = function(complainAboutPopUpBlockingParam) {\r
+                                       if (checkCanConfigure("complainAboutPopUpBlocking")) {\r
+                                               complainAboutPopUpBlocking = bool(complainAboutPopUpBlockingParam);\r
+                                       }\r
+                               };\r
+\r
+                               this.isFocusPopUp = function() { return focusConsoleWindow; };\r
+                               this.setFocusPopUp = function(focusPopUpParam) {\r
+                                       // This property can be safely altered after logging has started\r
+                                       focusConsoleWindow = bool(focusPopUpParam);\r
+                               };\r
+\r
+                               this.isReopenWhenClosed = function() { return reopenWhenClosed; };\r
+                               this.setReopenWhenClosed = function(reopenWhenClosedParam) {\r
+                                       // This property can be safely altered after logging has started\r
+                                       reopenWhenClosed = bool(reopenWhenClosedParam);\r
+                               };\r
+\r
+                               this.close = function() {\r
+                                       logLog.debug("close " + this);\r
+                                       try {\r
+                                               popUp.close();\r
+                                               this.unload();\r
+                                       } catch (ex) {\r
+                                               // Do nothing\r
+                                       }\r
+                               };\r
+\r
+                               this.hide = function() {\r
+                                       logLog.debug("hide " + this);\r
+                                       if (consoleWindowExists()) {\r
+                                               this.close();\r
+                                       }\r
+                               };\r
+\r
+                               this.show = function() {\r
+                                       logLog.debug("show " + this);\r
+                                       if (!consoleWindowCreated) {\r
+                                               open();\r
+                                       }\r
+                               };\r
+\r
+                               this.isVisible = function() {\r
+                                       return safeToAppend();\r
+                               };\r
+\r
+                               // Define useful variables\r
+                               var popUp;\r
+\r
+                               // Create open, init, getConsoleWindow and safeToAppend functions\r
+                               open = function() {\r
+                                       var windowProperties = "width=" + width + ",height=" + height + ",status,resizable";\r
+                                       var frameInfo = "";\r
+                                       try {\r
+                                               var frameEl = window.frameElement;\r
+                                               if (frameEl) {\r
+                                                       frameInfo = "_" + frameEl.tagName + "_" + (frameEl.name || frameEl.id || "");\r
+                                               }\r
+                                       } catch (e) {\r
+                                               frameInfo = "_inaccessibleParentFrame";\r
+                                       }\r
+                                       var windowName = "PopUp_" + location.host.replace(/[^a-z0-9]/gi, "_") + "_" + consoleAppenderId + frameInfo;\r
+                                       if (!useOldPopUp || !useDocumentWrite) {\r
+                                               // Ensure a previous window isn't used by using a unique name\r
+                                               windowName = windowName + "_" + uniqueId;\r
+                                       }\r
+\r
+                                       var checkPopUpClosed = function(win) {\r
+                                               if (consoleClosed) {\r
+                                                       return true;\r
+                                               } else {\r
+                                                       try {\r
+                                                               return bool(win) && win.closed;\r
+                                                       } catch(ex) {}\r
+                                               }\r
+                                               return false;\r
+                                       };\r
+\r
+                                       var popUpClosedCallback = function() {\r
+                                               if (!consoleClosed) {\r
+                                                       appender.unload();\r
+                                               }\r
+                                       };\r
+\r
+                                       function finalInit() {\r
+                                               getConsoleWindow().setCloseIfOpenerCloses(!useOldPopUp || !useDocumentWrite);\r
+                                               consoleWindowLoadHandler();\r
+                                               consoleWindowLoaded = true;\r
+                                               appendQueuedLoggingEvents();\r
+                                               pollConsoleWindow(checkPopUpClosed, 500, popUpClosedCallback,\r
+                                                               "PopUpAppender.checkPopUpClosed: error checking pop-up window");\r
+                                       }\r
+\r
+                                       try {\r
+                                               popUp = window.open(getConsoleUrl(), windowName, windowProperties);\r
+                                               consoleClosed = false;\r
+                                               consoleWindowCreated = true;\r
+                                               if (popUp && popUp.document) {\r
+                                                       if (useDocumentWrite && useOldPopUp && isLoaded(popUp)) {\r
+                                                               popUp.mainPageReloaded();\r
+                                                               finalInit();\r
+                                                       } else {\r
+                                                               if (useDocumentWrite) {\r
+                                                                       writeHtml(popUp.document);\r
+                                                               }\r
+                                                               // Check if the pop-up window object is available\r
+                                                               var popUpLoadedTest = function(win) { return bool(win) && isLoaded(win); };\r
+                                                               if (isLoaded(popUp)) {\r
+                                                                       finalInit();\r
+                                                               } else {\r
+                                                                       pollConsoleWindow(popUpLoadedTest, 100, finalInit,\r
+                                                                                       "PopUpAppender.init: unable to create console window");\r
+                                                               }\r
+                                                       }\r
+                                               } else {\r
+                                                       isSupported = false;\r
+                                                       logLog.warn("PopUpAppender.init: pop-ups blocked, please unblock to use PopUpAppender");\r
+                                                       if (complainAboutPopUpBlocking) {\r
+                                                               handleError("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");\r
+                                                       }\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               handleError("PopUpAppender.init: error creating pop-up", ex);\r
+                                       }\r
+                               };\r
+\r
+                               createWindow = function() {\r
+                                       if (!initiallyMinimized) {\r
+                                               open();\r
+                                       }\r
+                               };\r
+\r
+                               init = function() {\r
+                                       createWindow();\r
+                                       initialized = true;\r
+                               };\r
+\r
+                               getConsoleWindow = function() {\r
+                                       return popUp;\r
+                               };\r
+\r
+                               safeToAppend = function() {\r
+                                       if (isSupported && !isUndefined(popUp) && !consoleClosed) {\r
+                                               if (popUp.closed ||\r
+                                                               (consoleWindowLoaded && isUndefined(popUp.closed))) { // Extra check for Opera\r
+                                                       appender.unload();\r
+                                                       logLog.debug("PopUpAppender: pop-up closed");\r
+                                                       return false;\r
+                                               }\r
+                                               if (!consoleWindowLoaded && isLoaded(popUp)) {\r
+                                                       consoleWindowLoaded = true;\r
+                                               }\r
+                                       }\r
+                                       return isSupported && consoleWindowLoaded && !consoleClosed;\r
+                               };\r
+                       }\r
+\r
+                       // Expose getConsoleWindow so that automated tests can check the DOM\r
+                       this.getConsoleWindow = getConsoleWindow;\r
+               };\r
+\r
+               ConsoleAppender.addGlobalCommandLineFunction = function(functionName, commandLineFunction) {\r
+                       defaultCommandLineFunctions.push([functionName, commandLineFunction]);\r
+               };\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               function PopUpAppender(lazyInit, initiallyMinimized, useDocumentWrite,\r
+                                                          width, height) {\r
+                       this.create(false, null, lazyInit, initiallyMinimized,\r
+                                       useDocumentWrite, width, height, this.defaults.focusPopUp);\r
+               }\r
+\r
+               PopUpAppender.prototype = new ConsoleAppender();\r
+\r
+               PopUpAppender.prototype.defaults = {\r
+                       layout: new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),\r
+                       initiallyMinimized: false,\r
+                       focusPopUp: false,\r
+                       lazyInit: true,\r
+                       useOldPopUp: true,\r
+                       complainAboutPopUpBlocking: true,\r
+                       newestMessageAtTop: false,\r
+                       scrollToLatestMessage: true,\r
+                       width: "600",\r
+                       height: "400",\r
+                       reopenWhenClosed: false,\r
+                       maxMessages: null,\r
+                       showCommandLine: true,\r
+                       commandLineObjectExpansionDepth: 1,\r
+                       showHideButton: false,\r
+                       showCloseButton: true,\r
+            showLogEntryDeleteButtons: true,\r
+            useDocumentWrite: true\r
+               };\r
+\r
+               PopUpAppender.prototype.toString = function() {\r
+                       return "PopUpAppender";\r
+               };\r
+\r
+               log4javascript.PopUpAppender = PopUpAppender;\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               function InPageAppender(container, lazyInit, initiallyMinimized,\r
+                                                               useDocumentWrite, width, height) {\r
+                       this.create(true, container, lazyInit, initiallyMinimized,\r
+                                       useDocumentWrite, width, height, false);\r
+               }\r
+\r
+               InPageAppender.prototype = new ConsoleAppender();\r
+\r
+               InPageAppender.prototype.defaults = {\r
+                       layout: new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),\r
+                       initiallyMinimized: false,\r
+                       lazyInit: true,\r
+                       newestMessageAtTop: false,\r
+                       scrollToLatestMessage: true,\r
+                       width: "100%",\r
+                       height: "220px",\r
+                       maxMessages: null,\r
+                       showCommandLine: true,\r
+                       commandLineObjectExpansionDepth: 1,\r
+                       showHideButton: false,\r
+                       showCloseButton: false,\r
+            showLogEntryDeleteButtons: true,\r
+            useDocumentWrite: true\r
+               };\r
+\r
+               InPageAppender.prototype.toString = function() {\r
+                       return "InPageAppender";\r
+               };\r
+\r
+               log4javascript.InPageAppender = InPageAppender;\r
+\r
+               // Next line for backwards compatibility\r
+               log4javascript.InlineAppender = InPageAppender;\r
+       })();\r
+       /* ---------------------------------------------------------------------- */\r
+       // Console extension functions\r
+\r
+       function padWithSpaces(str, len) {\r
+               if (str.length < len) {\r
+                       var spaces = [];\r
+                       var numberOfSpaces = Math.max(0, len - str.length);\r
+                       for (var i = 0; i < numberOfSpaces; i++) {\r
+                               spaces[i] = " ";\r
+                       }\r
+                       str += spaces.join("");\r
+               }\r
+               return str;\r
+       }\r
+\r
+       (function() {\r
+               function dir(obj) {\r
+                       var maxLen = 0;\r
+                       // Obtain the length of the longest property name\r
+                       for (var p in obj) {\r
+                               maxLen = Math.max(toStr(p).length, maxLen);\r
+                       }\r
+                       // Create the nicely formatted property list\r
+                       var propList = [];\r
+                       for (p in obj) {\r
+                               var propNameStr = "  " + padWithSpaces(toStr(p), maxLen + 2);\r
+                               var propVal;\r
+                               try {\r
+                                       propVal = splitIntoLines(toStr(obj[p])).join(padWithSpaces(newLine, maxLen + 6));\r
+                               } catch (ex) {\r
+                                       propVal = "[Error obtaining property. Details: " + getExceptionMessage(ex) + "]";\r
+                               }\r
+                               propList.push(propNameStr + propVal);\r
+                       }\r
+                       return propList.join(newLine);\r
+               }\r
+\r
+               var nodeTypes = {\r
+                       ELEMENT_NODE: 1,\r
+                       ATTRIBUTE_NODE: 2,\r
+                       TEXT_NODE: 3,\r
+                       CDATA_SECTION_NODE: 4,\r
+                       ENTITY_REFERENCE_NODE: 5,\r
+                       ENTITY_NODE: 6,\r
+                       PROCESSING_INSTRUCTION_NODE: 7,\r
+                       COMMENT_NODE: 8,\r
+                       DOCUMENT_NODE: 9,\r
+                       DOCUMENT_TYPE_NODE: 10,\r
+                       DOCUMENT_FRAGMENT_NODE: 11,\r
+                       NOTATION_NODE: 12\r
+               };\r
+\r
+               var preFormattedElements = ["script", "pre"];\r
+\r
+               // This should be the definitive list, as specified by the XHTML 1.0 Transitional DTD\r
+               var emptyElements = ["br", "img", "hr", "param", "link", "area", "input", "col", "base", "meta"];\r
+               var indentationUnit = "  ";\r
+\r
+               // Create and return an XHTML string from the node specified\r
+               function getXhtml(rootNode, includeRootNode, indentation, startNewLine, preformatted) {\r
+                       includeRootNode = (typeof includeRootNode == "undefined") ? true : !!includeRootNode;\r
+                       if (typeof indentation != "string") {\r
+                               indentation = "";\r
+                       }\r
+                       startNewLine = !!startNewLine;\r
+                       preformatted = !!preformatted;\r
+                       var xhtml;\r
+\r
+                       function isWhitespace(node) {\r
+                               return ((node.nodeType == nodeTypes.TEXT_NODE) && /^[ \t\r\n]*$/.test(node.nodeValue));\r
+                       }\r
+\r
+                       function fixAttributeValue(attrValue) {\r
+                               return attrValue.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");\r
+                       }\r
+\r
+                       function getStyleAttributeValue(el) {\r
+                               var stylePairs = el.style.cssText.split(";");\r
+                               var styleValue = "";\r
+                               var isFirst = true;\r
+                               for (var j = 0, len = stylePairs.length; j < len; j++) {\r
+                                       var nameValueBits = stylePairs[j].split(":");\r
+                                       var props = [];\r
+                                       if (!/^\s*$/.test(nameValueBits[0])) {\r
+                                               props.push(trim(nameValueBits[0]).toLowerCase() + ":" + trim(nameValueBits[1]));\r
+                                       }\r
+                                       styleValue = props.join(";");\r
+                               }\r
+                               return styleValue;\r
+                       }\r
+\r
+                       function getNamespace(el) {\r
+                               if (el.prefix) {\r
+                                       return el.prefix;\r
+                               } else if (el.outerHTML) {\r
+                                       var regex = new RegExp("<([^:]+):" + el.tagName + "[^>]*>", "i");\r
+                                       if (regex.test(el.outerHTML)) {\r
+                                               return RegExp.$1.toLowerCase();\r
+                                       }\r
+                               }\r
+                return "";\r
+                       }\r
+\r
+                       var lt = "<";\r
+                       var gt = ">";\r
+\r
+                       if (includeRootNode && rootNode.nodeType != nodeTypes.DOCUMENT_FRAGMENT_NODE) {\r
+                               switch (rootNode.nodeType) {\r
+                                       case nodeTypes.ELEMENT_NODE:\r
+                                               var tagName = rootNode.tagName.toLowerCase();\r
+                                               xhtml = startNewLine ? newLine + indentation : "";\r
+                                               xhtml += lt;\r
+                                               // Allow for namespaces, where present\r
+                                               var prefix = getNamespace(rootNode);\r
+                                               var hasPrefix = !!prefix;\r
+                                               if (hasPrefix) {\r
+                                                       xhtml += prefix + ":";\r
+                                               }\r
+                                               xhtml += tagName;\r
+                                               for (i = 0, len = rootNode.attributes.length; i < len; i++) {\r
+                                                       var currentAttr = rootNode.attributes[i];\r
+                                                       // Check the attribute is valid.\r
+                                                       if (!   currentAttr.specified ||\r
+                                                                       currentAttr.nodeValue === null ||\r
+                                                                       currentAttr.nodeName.toLowerCase() === "style" ||\r
+                                                                       typeof currentAttr.nodeValue !== "string" ||\r
+                                                                       currentAttr.nodeName.indexOf("_moz") === 0) {\r
+                                                               continue;\r
+                                                       }\r
+                                                       xhtml += " " + currentAttr.nodeName.toLowerCase() + "=\"";\r
+                                                       xhtml += fixAttributeValue(currentAttr.nodeValue);\r
+                                                       xhtml += "\"";\r
+                                               }\r
+                                               // Style needs to be done separately as it is not reported as an\r
+                                               // attribute in IE\r
+                                               if (rootNode.style.cssText) {\r
+                                                       var styleValue = getStyleAttributeValue(rootNode);\r
+                                                       if (styleValue !== "") {\r
+                                                               xhtml += " style=\"" + getStyleAttributeValue(rootNode) + "\"";\r
+                                                       }\r
+                                               }\r
+                                               if (array_contains(emptyElements, tagName) ||\r
+                                                               (hasPrefix && !rootNode.hasChildNodes())) {\r
+                                                       xhtml += "/" + gt;\r
+                                               } else {\r
+                                                       xhtml += gt;\r
+                                                       // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                                                       var childStartNewLine = !(rootNode.childNodes.length === 1 &&\r
+                                                               rootNode.childNodes[0].nodeType === nodeTypes.TEXT_NODE);\r
+                                                       var childPreformatted = array_contains(preFormattedElements, tagName);\r
+                                                       for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                                               xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit,\r
+                                                                       childStartNewLine, childPreformatted);\r
+                                                       }\r
+                                                       // Add the end tag\r
+                                                       var endTag = lt + "/" + tagName + gt;\r
+                                                       xhtml += childStartNewLine ? newLine + indentation + endTag : endTag;\r
+                                               }\r
+                                               return xhtml;\r
+                                       case nodeTypes.TEXT_NODE:\r
+                                               if (isWhitespace(rootNode)) {\r
+                                                       xhtml = "";\r
+                                               } else {\r
+                                                       if (preformatted) {\r
+                                                               xhtml = rootNode.nodeValue;\r
+                                                       } else {\r
+                                                               // Trim whitespace from each line of the text node\r
+                                                               var lines = splitIntoLines(trim(rootNode.nodeValue));\r
+                                                               var trimmedLines = [];\r
+                                                               for (var i = 0, len = lines.length; i < len; i++) {\r
+                                                                       trimmedLines[i] = trim(lines[i]);\r
+                                                               }\r
+                                                               xhtml = trimmedLines.join(newLine + indentation);\r
+                                                       }\r
+                                                       if (startNewLine) {\r
+                                                               xhtml = newLine + indentation + xhtml;\r
+                                                       }\r
+                                               }\r
+                                               return xhtml;\r
+                                       case nodeTypes.CDATA_SECTION_NODE:\r
+                                               return "<![CDA" + "TA[" + rootNode.nodeValue + "]" + "]>" + newLine;\r
+                                       case nodeTypes.DOCUMENT_NODE:\r
+                                               xhtml = "";\r
+                                               // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                                               for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                                       xhtml += getXhtml(rootNode.childNodes[i], true, indentation);\r
+                                               }\r
+                                               return xhtml;\r
+                                       default:\r
+                                               return "";\r
+                               }\r
+                       } else {\r
+                               xhtml = "";\r
+                               // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                               for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                       xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit);\r
+                               }\r
+                               return xhtml;\r
+                       }\r
+               }\r
+\r
+               function createCommandLineFunctions() {\r
+                       ConsoleAppender.addGlobalCommandLineFunction("$", function(appender, args, returnValue) {\r
+                               return document.getElementById(args[0]);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("dir", function(appender, args, returnValue) {\r
+                               var lines = [];\r
+                               for (var i = 0, len = args.length; i < len; i++) {\r
+                                       lines[i] = dir(args[i]);\r
+                               }\r
+                               return lines.join(newLine + newLine);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("dirxml", function(appender, args, returnValue) {\r
+                               var lines = [];\r
+                               for (var i = 0, len = args.length; i < len; i++) {\r
+                                       var win = appender.getCommandWindow();\r
+                                       lines[i] = getXhtml(args[i]);\r
+                               }\r
+                               return lines.join(newLine + newLine);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("cd", function(appender, args, returnValue) {\r
+                               var win, message;\r
+                               if (args.length === 0 || args[0] === "") {\r
+                                       win = window;\r
+                                       message = "Command line set to run in main window";\r
+                               } else {\r
+                                       if (args[0].window == args[0]) {\r
+                                               win = args[0];\r
+                                               message = "Command line set to run in frame '" + args[0].name + "'";\r
+                                       } else {\r
+                                               win = window.frames[args[0]];\r
+                                               if (win) {\r
+                                                       message = "Command line set to run in frame '" + args[0] + "'";\r
+                                               } else {\r
+                                                       returnValue.isError = true;\r
+                                                       message = "Frame '" + args[0] + "' does not exist";\r
+                                                       win = appender.getCommandWindow();\r
+                                               }\r
+                                       }\r
+                               }\r
+                               appender.setCommandWindow(win);\r
+                               return message;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("clear", function(appender, args, returnValue) {\r
+                               returnValue.appendResult = false;\r
+                               appender.clear();\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("keys", function(appender, args, returnValue) {\r
+                               var keys = [];\r
+                               for (var k in args[0]) {\r
+                                       keys.push(k);\r
+                               }\r
+                               return keys;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("values", function(appender, args, returnValue) {\r
+                               var values = [];\r
+                               for (var k in args[0]) {\r
+                                       try {\r
+                                               values.push(args[0][k]);\r
+                                       } catch (ex) {\r
+                                               logLog.warn("values(): Unable to obtain value for key " + k + ". Details: " + getExceptionMessage(ex));\r
+                                       }\r
+                               }\r
+                               return values;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("expansionDepth", function(appender, args, returnValue) {\r
+                               var expansionDepth = parseInt(args[0], 10);\r
+                               if (isNaN(expansionDepth) || expansionDepth < 0) {\r
+                                       returnValue.isError = true;\r
+                                       return "" + args[0] + " is not a valid expansion depth";\r
+                               } else {\r
+                                       appender.setCommandLineObjectExpansionDepth(expansionDepth);\r
+                                       return "Object expansion depth set to " + expansionDepth;\r
+                               }\r
+                       });\r
+               }\r
+\r
+               function init() {\r
+                       // Add command line functions\r
+                       createCommandLineFunctions();\r
+               }\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               init();\r
+       })();\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Main load\r
+\r
+   log4javascript.setDocumentReady = function() {\r
+       pageLoaded = true;\r
+       log4javascript.dispatchEvent("load", {});\r
+   };\r
+\r
+    if (window.addEventListener) {\r
+        window.addEventListener("load", log4javascript.setDocumentReady, false);\r
+    } else if (window.attachEvent) {\r
+        window.attachEvent("onload", log4javascript.setDocumentReady);\r
+    } else {\r
+        var oldOnload = window.onload;\r
+        if (typeof window.onload != "function") {\r
+            window.onload = log4javascript.setDocumentReady;\r
+        } else {\r
+            window.onload = function(evt) {\r
+                if (oldOnload) {\r
+                    oldOnload(evt);\r
+                }\r
+                log4javascript.setDocumentReady();\r
+            };\r
+        }\r
+    }\r
+\r
+    // Ensure that the log4javascript object is available in the window. This\r
+    // is necessary for log4javascript to be available in IE if loaded using\r
+    // Dojo's module system\r
+    window.log4javascript = log4javascript;\r
+\r
+    return log4javascript;\r
+})();
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript.js
new file mode 100644 (file)
index 0000000..eae582b
--- /dev/null
@@ -0,0 +1,23 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+var log4javascript_stub=(function(){var log4javascript;function ff(){return function(){};}\r
+function copy(obj,props){for(var i in props){obj[i]=props[i];}}\r
+var f=ff();var Logger=ff();copy(Logger.prototype,{addChild:f,getEffectiveAppenders:f,invalidateAppenderCache:f,getAdditivity:f,setAdditivity:f,addAppender:f,removeAppender:f,removeAllAppenders:f,log:f,setLevel:f,getLevel:f,getEffectiveLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f,callAppenders:f,group:f,groupEnd:f,time:f,timeEnd:f,assert:f,parent:new Logger()});var getLogger=function(){return new Logger();};function EventSupport(){}\r
+copy(EventSupport.prototype,{setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{}});function Log4JavaScript(){}\r
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.6",edition:"log4javascript",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AlertAppender=ff();log4javascript.AlertAppender.prototype=new log4javascript.Appender();log4javascript.BrowserConsoleAppender=ff();log4javascript.BrowserConsoleAppender.prototype=new log4javascript.Appender();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});function ConsoleAppender(){}\r
+ConsoleAppender.prototype=new log4javascript.Appender();copy(ConsoleAppender.prototype,{create:f,isNewestMessageAtTop:f,setNewestMessageAtTop:f,isScrollToLatestMessage:f,setScrollToLatestMessage:f,getWidth:f,setWidth:f,getHeight:f,setHeight:f,getMaxMessages:f,setMaxMessages:f,isShowCommandLine:f,setShowCommandLine:f,isShowHideButton:f,setShowHideButton:f,isShowCloseButton:f,setShowCloseButton:f,getCommandLineObjectExpansionDepth:f,setCommandLineObjectExpansionDepth:f,isInitiallyMinimized:f,setInitiallyMinimized:f,isUseDocumentWrite:f,setUseDocumentWrite:f,group:f,groupEnd:f,clear:f,focus:f,focusCommandLine:f,focusSearch:f,getCommandWindow:f,setCommandWindow:f,executeLastCommand:f,getCommandLayout:f,setCommandLayout:f,evalCommandAndAppend:f,addCommandLineFunction:f,storeCommandHistory:f,unload:f});ConsoleAppender.addGlobalCommandLineFunction=f;log4javascript.InPageAppender=ff();log4javascript.InPageAppender.prototype=new ConsoleAppender();copy(log4javascript.InPageAppender.prototype,{addCssProperty:f,hide:f,show:f,isVisible:f,close:f,defaults:{layout:new log4javascript.PatternLayout(),maxMessages:null}});log4javascript.InlineAppender=log4javascript.InPageAppender;log4javascript.PopUpAppender=ff();log4javascript.PopUpAppender.prototype=new ConsoleAppender();copy(log4javascript.PopUpAppender.prototype,{isUseOldPopUp:f,setUseOldPopUp:f,isComplainAboutPopUpBlocking:f,setComplainAboutPopUpBlocking:f,isFocusPopUp:f,setFocusPopUp:f,isReopenWhenClosed:f,setReopenWhenClosed:f,close:f,hide:f,show:f,defaults:{layout:new log4javascript.PatternLayout(),maxMessages:null}});return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite.js
new file mode 100644 (file)
index 0000000..7d2ea14
--- /dev/null
@@ -0,0 +1,21 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+var log4javascript_stub=(function(){var log4javascript;function ff(){return function(){};}\r
+function copy(obj,props){for(var i in props){obj[i]=props[i];}}\r
+var f=ff();var Logger=ff();copy(Logger.prototype,{setLevel:f,getLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f});var getLogger=function(){return new Logger();};function Log4JavaScript(){}\r
+log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.6",edition:"log4javascript_lite",setEnabled:f,isEnabled:f,setShowStackTraces:f,getDefaultLogger:getLogger,getLogger:getLogger,getNullLogger:getLogger,Level:ff(),LoggingEvent:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Appender.prototype.append=f;return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_lite_uncompressed.js
new file mode 100644 (file)
index 0000000..afb9ba7
--- /dev/null
@@ -0,0 +1,102 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+var log4javascript_stub = (function() {\r
+       var log4javascript;\r
+\r
+       function ff() {\r
+               return function() {};\r
+       }\r
+       function copy(obj, props) {\r
+               for (var i in props) {\r
+                       obj[i] = props[i];\r
+               }\r
+       }\r
+       var f = ff();\r
+\r
+       // Loggers\r
+       var Logger = ff();\r
+       copy(Logger.prototype, {\r
+               setLevel: f,\r
+               getLevel: f,\r
+               trace: f,\r
+               debug: f,\r
+               info: f,\r
+               warn: f,\r
+               error: f,\r
+               fatal: f,\r
+               isEnabledFor: f,\r
+               isTraceEnabled: f,\r
+               isDebugEnabled: f,\r
+               isInfoEnabled: f,\r
+               isWarnEnabled: f,\r
+               isErrorEnabled: f,\r
+               isFatalEnabled: f\r
+       });\r
+\r
+       var getLogger = function() {\r
+               return new Logger();\r
+       };\r
+\r
+       function Log4JavaScript() {}\r
+       log4javascript = new Log4JavaScript();\r
+\r
+       log4javascript = {\r
+               isStub: true,\r
+               version: "1.4.6",\r
+               edition: "log4javascript_lite",\r
+               setEnabled: f,\r
+               isEnabled: f,\r
+               setShowStackTraces: f,\r
+               getDefaultLogger: getLogger,\r
+               getLogger: getLogger,\r
+               getNullLogger: getLogger,\r
+               Level: ff(),\r
+               LoggingEvent: ff(),\r
+               Appender: ff()\r
+       };\r
+\r
+       // LoggingEvents\r
+       log4javascript.LoggingEvent.prototype = {\r
+               getThrowableStrRep: f,\r
+               getCombinedMessages: f\r
+       };\r
+\r
+       // Levels\r
+       log4javascript.Level.prototype = {\r
+               toString: f,\r
+               equals: f,\r
+               isGreaterOrEqual: f\r
+       };\r
+       var level = new log4javascript.Level();\r
+       copy(log4javascript.Level, {\r
+               ALL: level,\r
+               TRACE: level,\r
+               DEBUG: level,\r
+               INFO: level,\r
+               WARN: level,\r
+               ERROR: level,\r
+               FATAL: level,\r
+               OFF: level\r
+       });\r
+       \r
+       log4javascript.Appender.prototype.append = f;\r
+\r
+       return log4javascript;\r
+})();\r
+if (typeof window.log4javascript == "undefined") {\r
+       var log4javascript = log4javascript_stub;\r
+}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production.js
new file mode 100644 (file)
index 0000000..69a90a8
--- /dev/null
@@ -0,0 +1,22 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+var log4javascript_stub=(function(){var log4javascript;function ff(){return function(){};}\r
+function copy(obj,props){for(var i in props){obj[i]=props[i];}}\r
+var f=ff();var Logger=ff();copy(Logger.prototype,{addChild:f,getEffectiveAppenders:f,invalidateAppenderCache:f,getAdditivity:f,setAdditivity:f,addAppender:f,removeAppender:f,removeAllAppenders:f,log:f,setLevel:f,getLevel:f,getEffectiveLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f,callAppenders:f,group:f,groupEnd:f,time:f,timeEnd:f,assert:f,parent:new Logger()});var getLogger=function(){return new Logger();};function EventSupport(){}\r
+copy(EventSupport.prototype,{setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{}});function Log4JavaScript(){}\r
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.6",edition:"log4javascript_production",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_production_uncompressed.js
new file mode 100644 (file)
index 0000000..79eb7ca
--- /dev/null
@@ -0,0 +1,253 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+var log4javascript_stub = (function() {\r
+       var log4javascript;\r
+\r
+       function ff() {\r
+               return function() {};\r
+       }\r
+       function copy(obj, props) {\r
+               for (var i in props) {\r
+                       obj[i] = props[i];\r
+               }\r
+       }\r
+       var f = ff();\r
+\r
+       // Loggers\r
+       var Logger = ff();\r
+       copy(Logger.prototype, {\r
+               addChild: f,\r
+               getEffectiveAppenders: f,\r
+               invalidateAppenderCache: f,\r
+               getAdditivity: f,\r
+               setAdditivity: f,\r
+               addAppender: f,\r
+               removeAppender: f,\r
+               removeAllAppenders: f,\r
+               log: f,\r
+               setLevel: f,\r
+               getLevel: f,\r
+               getEffectiveLevel: f,\r
+               trace: f,\r
+               debug: f,\r
+               info: f,\r
+               warn: f,\r
+               error: f,\r
+               fatal: f,\r
+               isEnabledFor: f,\r
+               isTraceEnabled: f,\r
+               isDebugEnabled: f,\r
+               isInfoEnabled: f,\r
+               isWarnEnabled: f,\r
+               isErrorEnabled: f,\r
+               isFatalEnabled: f,\r
+               callAppenders: f,\r
+               group: f,\r
+               groupEnd: f,\r
+               time: f,\r
+               timeEnd: f,\r
+               assert: f,\r
+               parent: new Logger()\r
+       });\r
+\r
+       var getLogger = function() {\r
+               return new Logger();\r
+       };\r
+\r
+       function EventSupport() {}\r
+\r
+       copy(EventSupport.prototype, {\r
+               setEventTypes: f,\r
+               addEventListener: f,\r
+               removeEventListener: f,\r
+               dispatchEvent: f,\r
+               eventTypes: [],\r
+               eventListeners: {}\r
+       });\r
+\r
+       function Log4JavaScript() {}\r
+       Log4JavaScript.prototype = new EventSupport();\r
+       log4javascript = new Log4JavaScript();\r
+\r
+       log4javascript = {\r
+               isStub: true,\r
+               version: "1.4.6",\r
+               edition: "log4javascript_production",\r
+        setDocumentReady: f,\r
+               setEventTypes: f,\r
+               addEventListener: f,\r
+               removeEventListener: f,\r
+               dispatchEvent: f,\r
+               eventTypes: [],\r
+               eventListeners: {},\r
+               logLog: {\r
+                       setQuietMode: f,\r
+                       setAlertAllErrors: f,\r
+                       debug: f,\r
+                       displayDebug: f,\r
+                       warn: f,\r
+                       error: f\r
+               },\r
+               handleError: f,\r
+               setEnabled: f,\r
+               isEnabled: f,\r
+               setTimeStampsInMilliseconds: f,\r
+               isTimeStampsInMilliseconds: f,\r
+               evalInScope: f,\r
+               setShowStackTraces: f,\r
+               getLogger: getLogger,\r
+               getDefaultLogger: getLogger,\r
+               getNullLogger: getLogger,\r
+               getRootLogger: getLogger,\r
+               resetConfiguration: f,\r
+               Level: ff(),\r
+               LoggingEvent: ff(),\r
+               Layout: ff(),\r
+               Appender: ff()\r
+       };\r
+\r
+       // LoggingEvents\r
+       log4javascript.LoggingEvent.prototype = {\r
+               getThrowableStrRep: f,\r
+               getCombinedMessages: f\r
+       };\r
+\r
+       // Levels\r
+       log4javascript.Level.prototype = {\r
+               toString: f,\r
+               equals: f,\r
+               isGreaterOrEqual: f\r
+       };\r
+       var level = new log4javascript.Level();\r
+       copy(log4javascript.Level, {\r
+               ALL: level,\r
+               TRACE: level,\r
+               DEBUG: level,\r
+               INFO: level,\r
+               WARN: level,\r
+               ERROR: level,\r
+               FATAL: level,\r
+               OFF: level\r
+       });\r
+\r
+       // Layouts\r
+       log4javascript.Layout.prototype = {\r
+               defaults: {},\r
+               format: f,\r
+               ignoresThrowable: f,\r
+               getContentType: f,\r
+               allowBatching: f,\r
+               getDataValues: f,\r
+               setKeys: f,\r
+               setCustomField: f,\r
+               hasCustomFields: f,\r
+               setTimeStampsInMilliseconds: f,\r
+               isTimeStampsInMilliseconds: f,\r
+               getTimeStampValue: f,\r
+               toString: f\r
+       };\r
+\r
+       // PatternLayout related\r
+       log4javascript.SimpleDateFormat = ff();\r
+       log4javascript.SimpleDateFormat.prototype = {\r
+               setMinimalDaysInFirstWeek: f,\r
+               getMinimalDaysInFirstWeek: f,\r
+               format: f\r
+       };\r
+\r
+       // PatternLayout\r
+       log4javascript.PatternLayout = ff();\r
+       log4javascript.PatternLayout.prototype = new log4javascript.Layout();\r
+\r
+       // Appenders\r
+       log4javascript.Appender = ff();\r
+       log4javascript.Appender.prototype = new EventSupport();\r
+\r
+       copy(log4javascript.Appender.prototype, {\r
+               layout: new log4javascript.PatternLayout(),\r
+               threshold: log4javascript.Level.ALL,\r
+               loggers: [],\r
+               doAppend: f,\r
+               append: f,\r
+               setLayout: f,\r
+               getLayout: f,\r
+               setThreshold: f,\r
+               getThreshold: f,\r
+               setAddedToLogger: f,\r
+               setRemovedFromLogger: f,\r
+               group: f,\r
+               groupEnd: f,\r
+               toString: f\r
+       });\r
+       // SimpleLayout\r
+       log4javascript.SimpleLayout = ff();\r
+       log4javascript.SimpleLayout.prototype = new log4javascript.Layout();\r
+       // NullLayout\r
+       log4javascript.NullLayout = ff();\r
+       log4javascript.NullLayout.prototype = new log4javascript.Layout();\r
+       // ZmlLayout\r
+       log4javascript.XmlLayout = ff();\r
+       log4javascript.XmlLayout.prototype = new log4javascript.Layout();\r
+       copy(log4javascript.XmlLayout.prototype, {\r
+               escapeCdata: f,\r
+               isCombinedMessages: f\r
+       });\r
+       // JsonLayout\r
+       log4javascript.JsonLayout = ff();\r
+       log4javascript.JsonLayout.prototype = new log4javascript.Layout();\r
+       copy(log4javascript.JsonLayout.prototype, {\r
+               isReadable: f,\r
+               isCombinedMessages: f\r
+       });\r
+       // HttpPostDataLayout \r
+       log4javascript.HttpPostDataLayout = ff();\r
+       log4javascript.HttpPostDataLayout.prototype = new log4javascript.Layout();\r
+       // PatternLayout\r
+       log4javascript.PatternLayout = ff();\r
+       log4javascript.PatternLayout.prototype = new log4javascript.Layout();\r
+       // AjaxAppender\r
+       log4javascript.AjaxAppender = ff();\r
+       log4javascript.AjaxAppender.prototype = new log4javascript.Appender();\r
+       copy(log4javascript.AjaxAppender.prototype, {\r
+               getSessionId: f,\r
+               setSessionId: f,\r
+               isTimed: f,\r
+               setTimed: f,\r
+               getTimerInterval: f,\r
+               setTimerInterval: f,\r
+               isWaitForResponse: f,\r
+               setWaitForResponse: f,\r
+               getBatchSize: f,\r
+               setBatchSize: f,\r
+               isSendAllOnUnload: f,\r
+               setSendAllOnUnload: f,\r
+               setRequestSuccessCallback: f,\r
+               setFailCallback: f,\r
+               getPostVarName: f,\r
+               setPostVarName: f,\r
+               sendAll: f,\r
+               sendAllRemaining: f,\r
+               defaults: {\r
+                       requestSuccessCallback: null,\r
+                       failCallback: null\r
+               }\r
+       });\r
+       return log4javascript;\r
+})();\r
+if (typeof window.log4javascript == "undefined") {\r
+       var log4javascript = log4javascript_stub;\r
+}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/stubs/log4javascript_uncompressed.js
new file mode 100644 (file)
index 0000000..1976fbc
--- /dev/null
@@ -0,0 +1,341 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+var log4javascript_stub = (function() {\r
+       var log4javascript;\r
+\r
+       function ff() {\r
+               return function() {};\r
+       }\r
+       function copy(obj, props) {\r
+               for (var i in props) {\r
+                       obj[i] = props[i];\r
+               }\r
+       }\r
+       var f = ff();\r
+\r
+       // Loggers\r
+       var Logger = ff();\r
+       copy(Logger.prototype, {\r
+               addChild: f,\r
+               getEffectiveAppenders: f,\r
+               invalidateAppenderCache: f,\r
+               getAdditivity: f,\r
+               setAdditivity: f,\r
+               addAppender: f,\r
+               removeAppender: f,\r
+               removeAllAppenders: f,\r
+               log: f,\r
+               setLevel: f,\r
+               getLevel: f,\r
+               getEffectiveLevel: f,\r
+               trace: f,\r
+               debug: f,\r
+               info: f,\r
+               warn: f,\r
+               error: f,\r
+               fatal: f,\r
+               isEnabledFor: f,\r
+               isTraceEnabled: f,\r
+               isDebugEnabled: f,\r
+               isInfoEnabled: f,\r
+               isWarnEnabled: f,\r
+               isErrorEnabled: f,\r
+               isFatalEnabled: f,\r
+               callAppenders: f,\r
+               group: f,\r
+               groupEnd: f,\r
+               time: f,\r
+               timeEnd: f,\r
+               assert: f,\r
+               parent: new Logger()\r
+       });\r
+\r
+       var getLogger = function() {\r
+               return new Logger();\r
+       };\r
+\r
+       function EventSupport() {}\r
+\r
+       copy(EventSupport.prototype, {\r
+               setEventTypes: f,\r
+               addEventListener: f,\r
+               removeEventListener: f,\r
+               dispatchEvent: f,\r
+               eventTypes: [],\r
+               eventListeners: {}\r
+       });\r
+\r
+       function Log4JavaScript() {}\r
+       Log4JavaScript.prototype = new EventSupport();\r
+       log4javascript = new Log4JavaScript();\r
+\r
+       log4javascript = {\r
+               isStub: true,\r
+               version: "1.4.6",\r
+               edition: "log4javascript",\r
+        setDocumentReady: f,\r
+               setEventTypes: f,\r
+               addEventListener: f,\r
+               removeEventListener: f,\r
+               dispatchEvent: f,\r
+               eventTypes: [],\r
+               eventListeners: {},\r
+               logLog: {\r
+                       setQuietMode: f,\r
+                       setAlertAllErrors: f,\r
+                       debug: f,\r
+                       displayDebug: f,\r
+                       warn: f,\r
+                       error: f\r
+               },\r
+               handleError: f,\r
+               setEnabled: f,\r
+               isEnabled: f,\r
+               setTimeStampsInMilliseconds: f,\r
+               isTimeStampsInMilliseconds: f,\r
+               evalInScope: f,\r
+               setShowStackTraces: f,\r
+               getLogger: getLogger,\r
+               getDefaultLogger: getLogger,\r
+               getNullLogger: getLogger,\r
+               getRootLogger: getLogger,\r
+               resetConfiguration: f,\r
+               Level: ff(),\r
+               LoggingEvent: ff(),\r
+               Layout: ff(),\r
+               Appender: ff()\r
+       };\r
+\r
+       // LoggingEvents\r
+       log4javascript.LoggingEvent.prototype = {\r
+               getThrowableStrRep: f,\r
+               getCombinedMessages: f\r
+       };\r
+\r
+       // Levels\r
+       log4javascript.Level.prototype = {\r
+               toString: f,\r
+               equals: f,\r
+               isGreaterOrEqual: f\r
+       };\r
+       var level = new log4javascript.Level();\r
+       copy(log4javascript.Level, {\r
+               ALL: level,\r
+               TRACE: level,\r
+               DEBUG: level,\r
+               INFO: level,\r
+               WARN: level,\r
+               ERROR: level,\r
+               FATAL: level,\r
+               OFF: level\r
+       });\r
+\r
+       // Layouts\r
+       log4javascript.Layout.prototype = {\r
+               defaults: {},\r
+               format: f,\r
+               ignoresThrowable: f,\r
+               getContentType: f,\r
+               allowBatching: f,\r
+               getDataValues: f,\r
+               setKeys: f,\r
+               setCustomField: f,\r
+               hasCustomFields: f,\r
+               setTimeStampsInMilliseconds: f,\r
+               isTimeStampsInMilliseconds: f,\r
+               getTimeStampValue: f,\r
+               toString: f\r
+       };\r
+\r
+       // PatternLayout related\r
+       log4javascript.SimpleDateFormat = ff();\r
+       log4javascript.SimpleDateFormat.prototype = {\r
+               setMinimalDaysInFirstWeek: f,\r
+               getMinimalDaysInFirstWeek: f,\r
+               format: f\r
+       };\r
+\r
+       // PatternLayout\r
+       log4javascript.PatternLayout = ff();\r
+       log4javascript.PatternLayout.prototype = new log4javascript.Layout();\r
+\r
+       // Appenders\r
+       log4javascript.Appender = ff();\r
+       log4javascript.Appender.prototype = new EventSupport();\r
+\r
+       copy(log4javascript.Appender.prototype, {\r
+               layout: new log4javascript.PatternLayout(),\r
+               threshold: log4javascript.Level.ALL,\r
+               loggers: [],\r
+               doAppend: f,\r
+               append: f,\r
+               setLayout: f,\r
+               getLayout: f,\r
+               setThreshold: f,\r
+               getThreshold: f,\r
+               setAddedToLogger: f,\r
+               setRemovedFromLogger: f,\r
+               group: f,\r
+               groupEnd: f,\r
+               toString: f\r
+       });\r
+       // SimpleLayout\r
+       log4javascript.SimpleLayout = ff();\r
+       log4javascript.SimpleLayout.prototype = new log4javascript.Layout();\r
+       // NullLayout\r
+       log4javascript.NullLayout = ff();\r
+       log4javascript.NullLayout.prototype = new log4javascript.Layout();\r
+       // ZmlLayout\r
+       log4javascript.XmlLayout = ff();\r
+       log4javascript.XmlLayout.prototype = new log4javascript.Layout();\r
+       copy(log4javascript.XmlLayout.prototype, {\r
+               escapeCdata: f,\r
+               isCombinedMessages: f\r
+       });\r
+       // JsonLayout\r
+       log4javascript.JsonLayout = ff();\r
+       log4javascript.JsonLayout.prototype = new log4javascript.Layout();\r
+       copy(log4javascript.JsonLayout.prototype, {\r
+               isReadable: f,\r
+               isCombinedMessages: f\r
+       });\r
+       // HttpPostDataLayout \r
+       log4javascript.HttpPostDataLayout = ff();\r
+       log4javascript.HttpPostDataLayout.prototype = new log4javascript.Layout();\r
+       // PatternLayout\r
+       log4javascript.PatternLayout = ff();\r
+       log4javascript.PatternLayout.prototype = new log4javascript.Layout();\r
+       // AlertAppender\r
+       log4javascript.AlertAppender = ff();\r
+       log4javascript.AlertAppender.prototype = new log4javascript.Appender();\r
+       // BrowserConsoleAppender\r
+       log4javascript.BrowserConsoleAppender = ff();\r
+       log4javascript.BrowserConsoleAppender.prototype = new log4javascript.Appender();\r
+       // AjaxAppender\r
+       log4javascript.AjaxAppender = ff();\r
+       log4javascript.AjaxAppender.prototype = new log4javascript.Appender();\r
+       copy(log4javascript.AjaxAppender.prototype, {\r
+               getSessionId: f,\r
+               setSessionId: f,\r
+               isTimed: f,\r
+               setTimed: f,\r
+               getTimerInterval: f,\r
+               setTimerInterval: f,\r
+               isWaitForResponse: f,\r
+               setWaitForResponse: f,\r
+               getBatchSize: f,\r
+               setBatchSize: f,\r
+               isSendAllOnUnload: f,\r
+               setSendAllOnUnload: f,\r
+               setRequestSuccessCallback: f,\r
+               setFailCallback: f,\r
+               getPostVarName: f,\r
+               setPostVarName: f,\r
+               sendAll: f,\r
+               sendAllRemaining: f,\r
+               defaults: {\r
+                       requestSuccessCallback: null,\r
+                       failCallback: null\r
+               }\r
+       });\r
+       // ConsoleAppender\r
+       function ConsoleAppender() {}\r
+       ConsoleAppender.prototype = new log4javascript.Appender();\r
+       copy(ConsoleAppender.prototype, {\r
+               create: f,\r
+               isNewestMessageAtTop: f,\r
+               setNewestMessageAtTop: f,\r
+               isScrollToLatestMessage: f,\r
+               setScrollToLatestMessage: f,\r
+               getWidth: f,\r
+               setWidth: f,\r
+               getHeight: f,\r
+               setHeight: f,\r
+               getMaxMessages: f,\r
+               setMaxMessages: f,\r
+               isShowCommandLine: f,\r
+               setShowCommandLine: f,\r
+               isShowHideButton: f,\r
+               setShowHideButton: f,\r
+               isShowCloseButton: f,\r
+               setShowCloseButton: f,\r
+               getCommandLineObjectExpansionDepth: f,\r
+               setCommandLineObjectExpansionDepth: f,\r
+               isInitiallyMinimized: f,\r
+               setInitiallyMinimized: f,\r
+               isUseDocumentWrite: f,\r
+               setUseDocumentWrite: f,\r
+               group: f,\r
+               groupEnd: f,\r
+               clear: f,\r
+               focus: f,\r
+               focusCommandLine: f,\r
+               focusSearch: f,\r
+               getCommandWindow: f,\r
+               setCommandWindow: f,\r
+               executeLastCommand: f,\r
+               getCommandLayout: f,\r
+               setCommandLayout: f,\r
+               evalCommandAndAppend: f,\r
+               addCommandLineFunction: f,\r
+               storeCommandHistory: f,\r
+               unload: f\r
+       });\r
+\r
+       ConsoleAppender.addGlobalCommandLineFunction = f;\r
+\r
+       // InPageAppender\r
+       log4javascript.InPageAppender = ff();\r
+       log4javascript.InPageAppender.prototype = new ConsoleAppender();\r
+       copy(log4javascript.InPageAppender.prototype, {\r
+               addCssProperty: f,\r
+               hide: f,\r
+               show: f,\r
+               isVisible: f,\r
+               close: f,\r
+               defaults: {\r
+                       layout: new log4javascript.PatternLayout(),\r
+                       maxMessages: null\r
+               }\r
+       });\r
+       log4javascript.InlineAppender = log4javascript.InPageAppender;\r
+\r
+       // PopUpAppender\r
+       log4javascript.PopUpAppender = ff();\r
+       log4javascript.PopUpAppender.prototype = new ConsoleAppender();\r
+       copy(log4javascript.PopUpAppender.prototype, {\r
+               isUseOldPopUp: f,\r
+               setUseOldPopUp: f,\r
+               isComplainAboutPopUpBlocking: f,\r
+               setComplainAboutPopUpBlocking: f,\r
+               isFocusPopUp: f,\r
+               setFocusPopUp: f,\r
+               isReopenWhenClosed: f,\r
+               setReopenWhenClosed: f,\r
+               close: f,\r
+               hide: f,\r
+               show: f,\r
+               defaults: {\r
+                       layout: new log4javascript.PatternLayout(),\r
+                       maxMessages: null\r
+               }\r
+       });\r
+       return log4javascript;\r
+})();\r
+if (typeof window.log4javascript == "undefined") {\r
+       var log4javascript = log4javascript_stub;\r
+}\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript.js
new file mode 100644 (file)
index 0000000..89fd903
--- /dev/null
@@ -0,0 +1,32 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+function array_contains(arr,val){for(var i=0;i<arr.length;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function compareObjectInterface(obj1,obj1_name,obj2,obj2_name,namePrefix){if(!namePrefix){namePrefix="";}\r
+var obj1PropertyNames=new Array();for(var i in obj1){if(i!="prototype"&&i!="arguments"){obj1PropertyNames.push(i);}}\r
+if(obj1&&obj1.prototype&&!array_contains(obj1PropertyNames,"prototype")){}\r
+for(var j=0;j<obj1PropertyNames.length;j++){var propertyName=obj1PropertyNames[j];if((typeof obj1[propertyName]=="function"||typeof obj1[propertyName]=="object")&&!(obj1[propertyName]instanceof Array)){var propertyFullyQualifiedName=(namePrefix=="")?propertyName:namePrefix+"."+propertyName;try{if(typeof obj2[propertyName]=="undefined"){throw new Error(obj2_name+" does not contain "+propertyFullyQualifiedName+" in "+obj1_name);}else if(typeof obj2[propertyName]!=typeof obj1[propertyName]){throw new Error(obj2_name+"'s "+propertyFullyQualifiedName+" is of the wrong type: "+typeof obj2[propertyName]+" when it is type "+typeof obj1[propertyName]+" in "+obj1_name);}else if(obj1[propertyName]!=Function.prototype.apply){if(!compareObjectInterface(obj1[propertyName],obj1_name,obj2[propertyName],obj2_name,propertyFullyQualifiedName)){throw new Error("Interfaces don't match");}}}catch(ex){throw new Error("Exception while checking property name "+propertyFullyQualifiedName+" in "+obj2_name+": "+ex.message);}}}\r
+return true;};var testLayoutWithVariables=function(layout,t){var emptyObject={};var emptyArray=[];var emptyString="";var localUndefined=emptyArray[0];var oneLevelObject={"name":"One-level object"};var twoLevelObject={"name":"Two-level object","data":oneLevelObject};var threeLevelObject={"name":"Three-level object","data":twoLevelObject};var anArray=[3,"stuff",true,false,0,null,localUndefined,3.14,function(p){return"I'm a function";},[1,"things"]];var arrayOfTestItems=[emptyObject,emptyString,emptyString,localUndefined,oneLevelObject,twoLevelObject,threeLevelObject,anArray];t.log("Testing layout "+layout)\r
+for(var i=0;i<arrayOfTestItems.length;i++){var ex=new Error("Test error");var loggingEvent=new log4javascript.LoggingEvent(t.logger,new Date(),log4javascript.Level.INFO,[arrayOfTestItems[i]],null);t.log("Formatting",arrayOfTestItems[i],result);var result=layout.format(loggingEvent);loggingEvent.exception=ex;t.log("Formatting with exception",arrayOfTestItems[i],result);result=layout.format(loggingEvent);}};xn.test.enableTestDebug=true;xn.test.enable_log4javascript=false;xn.test.suite("log4javascript tests",function(s){log4javascript.logLog.setQuietMode(true);var ArrayAppender=function(layout){if(layout){this.setLayout(layout);}\r
+this.logMessages=[];};ArrayAppender.prototype=new log4javascript.Appender();ArrayAppender.prototype.layout=new log4javascript.NullLayout();ArrayAppender.prototype.append=function(loggingEvent){var formattedMessage=this.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+this.logMessages.push(formattedMessage);};ArrayAppender.prototype.toString=function(){return"[ArrayAppender]";};s.setUp=function(t){t.logger=log4javascript.getLogger("test");t.logger.removeAllAppenders();t.appender=new ArrayAppender();t.logger.addAppender(t.appender);};s.tearDown=function(t){t.logger.removeAppender(t.appender);log4javascript.resetConfiguration();};s.test("Stub script interface test",function(t){try{compareObjectInterface(log4javascript,"log4javascript",log4javascript_stub,"log4javascript_stub");}catch(ex){t.fail(ex);}});s.test("Disable log4javascript test",function(t){log4javascript.setEnabled(false);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,0);log4javascript.setEnabled(true);});s.test("Array.splice test 1",function(t){var a=["Marlon","Ashley","Darius","Lloyd"];var deletedItems=a.splice(1,2);t.assertEquals(a.join(","),"Marlon,Lloyd");t.assertEquals(deletedItems.join(","),"Ashley,Darius");});s.test("Array.splice test 2",function(t){var a=["Marlon","Ashley","Darius","Lloyd"];var deletedItems=a.splice(1,1,"Malky","Jay");t.assertEquals(a.join(","),"Marlon,Malky,Jay,Darius,Lloyd");t.assertEquals(deletedItems.join(","),"Ashley");});s.test("array_remove test",function(t){var array_remove=log4javascript.evalInScope("array_remove");var a=["Marlon","Ashley","Darius"];array_remove(a,"Darius");t.assertEquals(a.join(","),"Marlon,Ashley");});s.test("array_remove with empty array test",function(t){var array_remove=log4javascript.evalInScope("array_remove");var a=[];array_remove(a,"Darius");t.assertEquals(a.join(","),"");});s.test("Logger logging test",function(t){t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,1);});s.test("Logger levels test",function(t){var originalLevel=t.logger.getEffectiveLevel();t.logger.setLevel(log4javascript.Level.INFO);t.logger.debug("TEST");t.logger.setLevel(originalLevel);t.assertEquals(t.appender.logMessages.length,0);});s.test("Logger getEffectiveLevel inheritance test 1",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");parentLogger.setLevel(log4javascript.Level.ERROR);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.ERROR);});s.test("Logger getEffectiveLevel inheritance test 2",function(t){var grandParentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2.test3");grandParentLogger.setLevel(log4javascript.Level.ERROR);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.ERROR);});s.test("Logger getEffectiveLevel inheritance test 3",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");parentLogger.setLevel(log4javascript.Level.ERROR);childLogger.setLevel(log4javascript.Level.INFO);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.INFO);});s.test("Logger getEffectiveLevel root inheritance test",function(t){var rootLogger=log4javascript.getRootLogger();var childLogger=log4javascript.getLogger("test1.test2.test3");rootLogger.setLevel(log4javascript.Level.WARN);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.WARN);});s.test("Logger null level test",function(t){t.logger.setLevel(null);t.assertEquals(t.logger.getEffectiveLevel(),log4javascript.Level.DEBUG);});s.test("Logger appender additivity test 1",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");t.assertEquals(parentLoggerAppender.logMessages.length,2);t.assertEquals(childLoggerAppender.logMessages.length,1);});s.test("Logger appender additivity test 2",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);childLogger.setAdditivity(false);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");t.assertEquals(parentLoggerAppender.logMessages.length,1);t.assertEquals(childLoggerAppender.logMessages.length,1);});s.test("Logger appender additivity test 3",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);childLogger.setAdditivity(false);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");childLogger.setAdditivity(true);childLogger.info("Child logger test message 2");t.assertEquals(parentLoggerAppender.logMessages.length,2);t.assertEquals(childLoggerAppender.logMessages.length,2);});s.test("Appender threshold test",function(t){t.appender.setThreshold(log4javascript.Level.INFO);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,0);});s.test("Basic appender / layout test",function(t){t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST");});s.test("Appender uniqueness within logger test",function(t){t.logger.addAppender(t.appender);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,1);});s.test("Logger remove appender test",function(t){t.logger.debug("TEST");t.logger.removeAppender(t.appender);t.logger.debug("TEST AGAIN");t.assertEquals(t.appender.logMessages.length,1);});s.test("",function(t){t.logger.debug("TEST");t.logger.removeAppender(t.appender);t.logger.debug("TEST AGAIN");t.assertEquals(t.appender.logMessages.length,1);});s.test("SimpleLayout format test",function(t){var layout=new log4javascript.SimpleLayout();testLayoutWithVariables(layout,t);});s.test("SimpleLayout test",function(t){t.appender.setLayout(new log4javascript.SimpleLayout());t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"DEBUG - TEST");});s.test("NullLayout format test",function(t){var layout=new log4javascript.NullLayout();testLayoutWithVariables(layout,t);});s.test("NullLayout test",function(t){t.appender.setLayout(new log4javascript.NullLayout());t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST");});s.test("XmlLayout format test",function(t){var layout=new log4javascript.XmlLayout();testLayoutWithVariables(layout,t);});s.test("XmlLayout test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST");t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});s.test("XmlLayout with exception test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<log4javascript:exception>\s*<!\[CDATA\[.*\]\]><\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});var setUpXmlLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.XmlLayout();}\r
+s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInMilliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInSeconds+'" milliseconds="'+t.milliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInSeconds+'" milliseconds="'+t.milliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+"  null,"+newLine+"  undefined,"+newLine+"  1.2,"+newLine+"  A string,"+newLine+"  1,test,"+newLine+"  [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+"  null,"+newLine+"  undefined,"+newLine+"  1.2,"+newLine+"  A string,"+newLine+"  ["+newLine+"    1,"+newLine+"    test"+newLine+"  ],"+newLine+"  {"+newLine+"    a: [object Object]"+newLine+"  }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+"  STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+"  a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST|  TEST|TEST  |ST|ST|  TEST|ST|TEST  |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n  strikers: [object Object]\r\n} {\r\n\  strikers: {\r\n    quick: Marlon\r\n  }\r\n}",t.appender.logMessages[0]);});s.test("Logging/grouping test",function(t){var browserConsoleAppender=new log4javascript.BrowserConsoleAppender();t.logger.addAppender(browserConsoleAppender);t.logger.trace("TEST TRACE");t.logger.debug("TEST DEBUG");t.logger.info("TEST INFO");t.logger.warn("TEST WARN");t.logger.error("TEST ERROR");t.logger.fatal("TEST FATAL");t.logger.fatal("TEST FATAL",new Error("Fake error"));t.logger.info("TEST INFO","Second message",["a","b","c"]);t.logger.group("TEST GROUP");t.logger.info("TEST INFO");t.logger.groupEnd("TEST GROUP");t.logger.info("TEST INFO");t.logger.removeAppender(browserConsoleAppender);});var testConsoleAppender=function(t,appender){var timeoutCallback=function(){return(windowLoaded?"Timed out while waiting for messages to appear":"Timed out while waiting for window to load")+". Debug messages: "+\r
+log4javascript.logLog.debugMessages.join("\r\n");}\r
+t.async(60000,timeoutCallback);var windowLoaded=false;var domChecked=false;var onLoadHandler=function(){log4javascript.logLog.debug("onLoadHandler");windowLoaded=true;var win=appender.getConsoleWindow();if(win&&win.loaded){var checkDom=function(){log4javascript.logLog.debug("checkDom");domChecked=true;var logContainer=win.logMainContainer;if(logContainer.hasChildNodes()){if(logContainer.innerHTML.indexOf("TEST MESSAGE")==-1){appender.close();t.fail("Log message not correctly logged (log container innerHTML: "+logContainer.innerHTML+")");}else{t.assert(appender.isVisible());appender.close();t.assert(!appender.isVisible());t.succeed();}}else{appender.close();t.fail("Console has no log messages");}}\r
+window.setTimeout(checkDom,300);}else{appender.close();t.fail("Console mistakenly raised load event");}}\r
+appender.addEventListener("load",onLoadHandler);t.logger.addAppender(appender);t.logger.debug("TEST MESSAGE");};s.test("InlineAppender test",function(t){var inlineAppender=new log4javascript.InlineAppender();inlineAppender.setInitiallyMinimized(false);inlineAppender.setNewestMessageAtTop(false);inlineAppender.setScrollToLatestMessage(true);inlineAppender.setWidth(600);inlineAppender.setHeight(200);testConsoleAppender(t,inlineAppender);});s.test("InPageAppender with separate console HTML file test",function(t){var inPageAppender=new log4javascript.InPageAppender();inPageAppender.setInitiallyMinimized(false);inPageAppender.setNewestMessageAtTop(false);inPageAppender.setScrollToLatestMessage(true);inPageAppender.setUseDocumentWrite(false);inPageAppender.setWidth(600);inPageAppender.setHeight(200);testConsoleAppender(t,inPageAppender);});s.test("PopUpAppender test",function(t){var popUpAppender=new log4javascript.PopUpAppender();popUpAppender.setFocusPopUp(true);popUpAppender.setUseOldPopUp(false);popUpAppender.setNewestMessageAtTop(false);popUpAppender.setScrollToLatestMessage(true);popUpAppender.setComplainAboutPopUpBlocking(false);popUpAppender.setWidth(600);popUpAppender.setHeight(200);testConsoleAppender(t,popUpAppender);});s.test("PopUpAppender with separate console HTML file test",function(t){var popUpAppender=new log4javascript.PopUpAppender();popUpAppender.setFocusPopUp(true);popUpAppender.setUseOldPopUp(false);popUpAppender.setNewestMessageAtTop(false);popUpAppender.setScrollToLatestMessage(true);popUpAppender.setComplainAboutPopUpBlocking(false);popUpAppender.setUseDocumentWrite(false);popUpAppender.setWidth(600);popUpAppender.setHeight(200);testConsoleAppender(t,popUpAppender);});});\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite.js
new file mode 100644 (file)
index 0000000..b9eb6b7
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_lite_uncompressed.js
new file mode 100644 (file)
index 0000000..b9eb6b7
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production.js
new file mode 100644 (file)
index 0000000..f5d1090
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+function array_contains(arr,val){for(var i=0;i<arr.length;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function compareObjectInterface(obj1,obj1_name,obj2,obj2_name,namePrefix){if(!namePrefix){namePrefix="";}\r
+var obj1PropertyNames=new Array();for(var i in obj1){if(i!="prototype"&&i!="arguments"){obj1PropertyNames.push(i);}}\r
+if(obj1&&obj1.prototype&&!array_contains(obj1PropertyNames,"prototype")){}\r
+for(var j=0;j<obj1PropertyNames.length;j++){var propertyName=obj1PropertyNames[j];if((typeof obj1[propertyName]=="function"||typeof obj1[propertyName]=="object")&&!(obj1[propertyName]instanceof Array)){var propertyFullyQualifiedName=(namePrefix=="")?propertyName:namePrefix+"."+propertyName;try{if(typeof obj2[propertyName]=="undefined"){throw new Error(obj2_name+" does not contain "+propertyFullyQualifiedName+" in "+obj1_name);}else if(typeof obj2[propertyName]!=typeof obj1[propertyName]){throw new Error(obj2_name+"'s "+propertyFullyQualifiedName+" is of the wrong type: "+typeof obj2[propertyName]+" when it is type "+typeof obj1[propertyName]+" in "+obj1_name);}else if(obj1[propertyName]!=Function.prototype.apply){if(!compareObjectInterface(obj1[propertyName],obj1_name,obj2[propertyName],obj2_name,propertyFullyQualifiedName)){throw new Error("Interfaces don't match");}}}catch(ex){throw new Error("Exception while checking property name "+propertyFullyQualifiedName+" in "+obj2_name+": "+ex.message);}}}\r
+return true;};var testLayoutWithVariables=function(layout,t){var emptyObject={};var emptyArray=[];var emptyString="";var localUndefined=emptyArray[0];var oneLevelObject={"name":"One-level object"};var twoLevelObject={"name":"Two-level object","data":oneLevelObject};var threeLevelObject={"name":"Three-level object","data":twoLevelObject};var anArray=[3,"stuff",true,false,0,null,localUndefined,3.14,function(p){return"I'm a function";},[1,"things"]];var arrayOfTestItems=[emptyObject,emptyString,emptyString,localUndefined,oneLevelObject,twoLevelObject,threeLevelObject,anArray];t.log("Testing layout "+layout)\r
+for(var i=0;i<arrayOfTestItems.length;i++){var ex=new Error("Test error");var loggingEvent=new log4javascript.LoggingEvent(t.logger,new Date(),log4javascript.Level.INFO,[arrayOfTestItems[i]],null);t.log("Formatting",arrayOfTestItems[i],result);var result=layout.format(loggingEvent);loggingEvent.exception=ex;t.log("Formatting with exception",arrayOfTestItems[i],result);result=layout.format(loggingEvent);}};xn.test.enableTestDebug=true;xn.test.enable_log4javascript=false;xn.test.suite("log4javascript tests",function(s){log4javascript.logLog.setQuietMode(true);var ArrayAppender=function(layout){if(layout){this.setLayout(layout);}\r
+this.logMessages=[];};ArrayAppender.prototype=new log4javascript.Appender();ArrayAppender.prototype.layout=new log4javascript.NullLayout();ArrayAppender.prototype.append=function(loggingEvent){var formattedMessage=this.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+this.logMessages.push(formattedMessage);};ArrayAppender.prototype.toString=function(){return"[ArrayAppender]";};s.setUp=function(t){t.logger=log4javascript.getLogger("test");t.logger.removeAllAppenders();t.appender=new ArrayAppender();t.logger.addAppender(t.appender);};s.tearDown=function(t){t.logger.removeAppender(t.appender);log4javascript.resetConfiguration();};s.test("Stub script interface test",function(t){try{compareObjectInterface(log4javascript,"log4javascript",log4javascript_stub,"log4javascript_stub");}catch(ex){t.fail(ex);}});s.test("Disable log4javascript test",function(t){log4javascript.setEnabled(false);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,0);log4javascript.setEnabled(true);});s.test("Array.splice test 1",function(t){var a=["Marlon","Ashley","Darius","Lloyd"];var deletedItems=a.splice(1,2);t.assertEquals(a.join(","),"Marlon,Lloyd");t.assertEquals(deletedItems.join(","),"Ashley,Darius");});s.test("Array.splice test 2",function(t){var a=["Marlon","Ashley","Darius","Lloyd"];var deletedItems=a.splice(1,1,"Malky","Jay");t.assertEquals(a.join(","),"Marlon,Malky,Jay,Darius,Lloyd");t.assertEquals(deletedItems.join(","),"Ashley");});s.test("array_remove test",function(t){var array_remove=log4javascript.evalInScope("array_remove");var a=["Marlon","Ashley","Darius"];array_remove(a,"Darius");t.assertEquals(a.join(","),"Marlon,Ashley");});s.test("array_remove with empty array test",function(t){var array_remove=log4javascript.evalInScope("array_remove");var a=[];array_remove(a,"Darius");t.assertEquals(a.join(","),"");});s.test("Logger logging test",function(t){t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,1);});s.test("Logger levels test",function(t){var originalLevel=t.logger.getEffectiveLevel();t.logger.setLevel(log4javascript.Level.INFO);t.logger.debug("TEST");t.logger.setLevel(originalLevel);t.assertEquals(t.appender.logMessages.length,0);});s.test("Logger getEffectiveLevel inheritance test 1",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");parentLogger.setLevel(log4javascript.Level.ERROR);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.ERROR);});s.test("Logger getEffectiveLevel inheritance test 2",function(t){var grandParentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2.test3");grandParentLogger.setLevel(log4javascript.Level.ERROR);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.ERROR);});s.test("Logger getEffectiveLevel inheritance test 3",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");parentLogger.setLevel(log4javascript.Level.ERROR);childLogger.setLevel(log4javascript.Level.INFO);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.INFO);});s.test("Logger getEffectiveLevel root inheritance test",function(t){var rootLogger=log4javascript.getRootLogger();var childLogger=log4javascript.getLogger("test1.test2.test3");rootLogger.setLevel(log4javascript.Level.WARN);t.assertEquals(childLogger.getEffectiveLevel(),log4javascript.Level.WARN);});s.test("Logger null level test",function(t){t.logger.setLevel(null);t.assertEquals(t.logger.getEffectiveLevel(),log4javascript.Level.DEBUG);});s.test("Logger appender additivity test 1",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");t.assertEquals(parentLoggerAppender.logMessages.length,2);t.assertEquals(childLoggerAppender.logMessages.length,1);});s.test("Logger appender additivity test 2",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);childLogger.setAdditivity(false);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");t.assertEquals(parentLoggerAppender.logMessages.length,1);t.assertEquals(childLoggerAppender.logMessages.length,1);});s.test("Logger appender additivity test 3",function(t){var parentLogger=log4javascript.getLogger("test1");var childLogger=log4javascript.getLogger("test1.test2");var parentLoggerAppender=new ArrayAppender();var childLoggerAppender=new ArrayAppender();parentLogger.addAppender(parentLoggerAppender);childLogger.addAppender(childLoggerAppender);childLogger.setAdditivity(false);parentLogger.info("Parent logger test message");childLogger.info("Child logger test message");childLogger.setAdditivity(true);childLogger.info("Child logger test message 2");t.assertEquals(parentLoggerAppender.logMessages.length,2);t.assertEquals(childLoggerAppender.logMessages.length,2);});s.test("Appender threshold test",function(t){t.appender.setThreshold(log4javascript.Level.INFO);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,0);});s.test("Basic appender / layout test",function(t){t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST");});s.test("Appender uniqueness within logger test",function(t){t.logger.addAppender(t.appender);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages.length,1);});s.test("Logger remove appender test",function(t){t.logger.debug("TEST");t.logger.removeAppender(t.appender);t.logger.debug("TEST AGAIN");t.assertEquals(t.appender.logMessages.length,1);});s.test("",function(t){t.logger.debug("TEST");t.logger.removeAppender(t.appender);t.logger.debug("TEST AGAIN");t.assertEquals(t.appender.logMessages.length,1);});s.test("SimpleLayout format test",function(t){var layout=new log4javascript.SimpleLayout();testLayoutWithVariables(layout,t);});s.test("SimpleLayout test",function(t){t.appender.setLayout(new log4javascript.SimpleLayout());t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"DEBUG - TEST");});s.test("NullLayout format test",function(t){var layout=new log4javascript.NullLayout();testLayoutWithVariables(layout,t);});s.test("NullLayout test",function(t){t.appender.setLayout(new log4javascript.NullLayout());t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST");});s.test("XmlLayout format test",function(t){var layout=new log4javascript.XmlLayout();testLayoutWithVariables(layout,t);});s.test("XmlLayout test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST");t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});s.test("XmlLayout with exception test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<log4javascript:exception>\s*<!\[CDATA\[.*\]\]><\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});var setUpXmlLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.XmlLayout();}\r
+s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInMilliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInSeconds+'" milliseconds="'+t.milliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^<log4javascript:event logger="test" timestamp="'+t.timeInSeconds+'" milliseconds="'+t.milliseconds+'" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+"  null,"+newLine+"  undefined,"+newLine+"  1.2,"+newLine+"  A string,"+newLine+"  1,test,"+newLine+"  [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+"  null,"+newLine+"  undefined,"+newLine+"  1.2,"+newLine+"  A string,"+newLine+"  ["+newLine+"    1,"+newLine+"    test"+newLine+"  ],"+newLine+"  {"+newLine+"    a: [object Object]"+newLine+"  }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+"  STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+"  a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST|  TEST|TEST  |ST|ST|  TEST|ST|TEST  |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n  strikers: [object Object]\r\n} {\r\n\  strikers: {\r\n    quick: Marlon\r\n  }\r\n}",t.appender.logMessages[0]);});});\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_production_uncompressed.js
new file mode 100644 (file)
index 0000000..e64990f
--- /dev/null
@@ -0,0 +1,728 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+function array_contains(arr, val) {\r
+       for (var i = 0; i < arr.length; i++) {\r
+               if (arr[i] == val) {\r
+                       return true;\r
+               }\r
+       }\r
+       return false;\r
+}\r
+\r
+// Recursively checks that obj2's interface contains all of obj1's\r
+// interface (functions and objects only)\r
+function compareObjectInterface(obj1, obj1_name, obj2, obj2_name, namePrefix) {\r
+       if (!namePrefix) {\r
+               namePrefix = "";\r
+       }\r
+       var obj1PropertyNames = new Array();\r
+       for (var i in obj1) {\r
+               if (i != "prototype" && i != "arguments") {\r
+                       obj1PropertyNames.push(i);\r
+               }\r
+       }\r
+       if (obj1 && obj1.prototype && !array_contains(obj1PropertyNames, "prototype")) {\r
+               //obj1PropertyNames.push("prototype");\r
+       }\r
+       for (var j = 0; j < obj1PropertyNames.length; j++) {\r
+               var propertyName = obj1PropertyNames[j];\r
+               if ((typeof obj1[propertyName] == "function" || typeof obj1[propertyName] == "object") && !(obj1[propertyName] instanceof Array)) {\r
+                       var propertyFullyQualifiedName = (namePrefix == "") ? propertyName : namePrefix + "." + propertyName;\r
+                       try {\r
+                               if (typeof obj2[propertyName] == "undefined") {\r
+                                       throw new Error(obj2_name + " does not contain " + propertyFullyQualifiedName + " in " + obj1_name);\r
+                               } else if (typeof obj2[propertyName] != typeof obj1[propertyName]){\r
+                                       throw new Error(obj2_name + "'s " + propertyFullyQualifiedName + " is of the wrong type: " + typeof obj2[propertyName] + " when it is type " + typeof obj1[propertyName] + " in " + obj1_name);\r
+                               } else if (obj1[propertyName] != Function.prototype.apply) {\r
+                                       if (!compareObjectInterface(obj1[propertyName], obj1_name, obj2[propertyName], obj2_name, propertyFullyQualifiedName)) {\r
+                                               throw new Error("Interfaces don't match");\r
+                                       }\r
+                               }\r
+                       } catch(ex) {\r
+                               throw new Error("Exception while checking property name " + propertyFullyQualifiedName + " in " + obj2_name + ": " + ex.message);\r
+                       }\r
+               }\r
+       }\r
+       return true;\r
+};\r
+\r
+// Simply tests a layout for exceptions when formatting\r
+var testLayoutWithVariables = function(layout, t) {\r
+       var emptyObject = {};\r
+       var emptyArray = [];\r
+       var emptyString = "";\r
+       var localUndefined = emptyArray[0];\r
+       var oneLevelObject = {\r
+               "name": "One-level object"\r
+       };\r
+       var twoLevelObject = {\r
+               "name": "Two-level object",\r
+               "data": oneLevelObject\r
+       };\r
+       var threeLevelObject = {\r
+               "name": "Three-level object",\r
+               "data": twoLevelObject\r
+       };\r
+       var anArray = [\r
+               3,\r
+               "stuff",\r
+               true,\r
+               false,\r
+               0,\r
+               null,\r
+               localUndefined,\r
+               3.14,\r
+               function(p) { return "I'm a function"; },\r
+               [1, "things"]\r
+       ];\r
+       var arrayOfTestItems = [emptyObject, emptyString, emptyString, localUndefined, oneLevelObject,\r
+                       twoLevelObject, threeLevelObject, anArray];\r
+\r
+       t.log("Testing layout " + layout)\r
+       for (var i = 0; i < arrayOfTestItems.length; i++) {\r
+               var ex = new Error("Test error");\r
+               var loggingEvent = new log4javascript.LoggingEvent(t.logger, new Date(), log4javascript.Level.INFO,\r
+                               [arrayOfTestItems[i]], null);\r
+               t.log("Formatting", arrayOfTestItems[i], result);\r
+               var result = layout.format(loggingEvent);\r
+               // Now try with an exception\r
+               loggingEvent.exception = ex;\r
+               t.log("Formatting with exception", arrayOfTestItems[i], result);\r
+               result = layout.format(loggingEvent);\r
+       }\r
+};\r
+\r
+xn.test.enableTestDebug = true;\r
+xn.test.enable_log4javascript = false;\r
+\r
+xn.test.suite("log4javascript tests", function(s) {\r
+       log4javascript.logLog.setQuietMode(true);\r
+       var ArrayAppender = function(layout) {\r
+               if (layout) {\r
+                       this.setLayout(layout);\r
+               }\r
+               this.logMessages = [];\r
+       };\r
+\r
+       ArrayAppender.prototype = new log4javascript.Appender();\r
+\r
+       ArrayAppender.prototype.layout = new log4javascript.NullLayout();\r
+\r
+       ArrayAppender.prototype.append = function(loggingEvent) {\r
+               var formattedMessage = this.getLayout().format(loggingEvent);\r
+               if (this.getLayout().ignoresThrowable()) {\r
+                       formattedMessage += loggingEvent.getThrowableStrRep();\r
+               }\r
+               this.logMessages.push(formattedMessage);\r
+       };\r
+\r
+       ArrayAppender.prototype.toString = function() {\r
+               return "[ArrayAppender]";\r
+       };\r
+\r
+    s.setUp = function(t) {\r
+        t.logger = log4javascript.getLogger("test");\r
+               t.logger.removeAllAppenders();\r
+               t.appender = new ArrayAppender();\r
+        t.logger.addAppender(t.appender);\r
+    };\r
+\r
+    s.tearDown = function(t) {\r
+        t.logger.removeAppender(t.appender);\r
+               log4javascript.resetConfiguration();\r
+       };\r
+\r
+    s.test("Stub script interface test", function(t) {\r
+        try {\r
+            compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");\r
+        } catch (ex) {\r
+            t.fail(ex);\r
+        }\r
+    });\r
+\r
+       s.test("Disable log4javascript test", function(t) {\r
+               log4javascript.setEnabled(false);\r
+               t.logger.debug("TEST");\r
+               t.assertEquals(t.appender.logMessages.length, 0);\r
+               log4javascript.setEnabled(true);\r
+       });\r
+\r
+    s.test("Array.splice test 1", function(t) {\r
+        var a = ["Marlon", "Ashley", "Darius", "Lloyd"];\r
+        var deletedItems = a.splice(1, 2);\r
+        t.assertEquals(a.join(","), "Marlon,Lloyd");\r
+        t.assertEquals(deletedItems.join(","), "Ashley,Darius");\r
+    });\r
+\r
+    s.test("Array.splice test 2", function(t) {\r
+        var a = ["Marlon", "Ashley", "Darius", "Lloyd"];\r
+        var deletedItems = a.splice(1, 1, "Malky", "Jay");\r
+        t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");\r
+        t.assertEquals(deletedItems.join(","), "Ashley");\r
+    });\r
+\r
+    s.test("array_remove test", function(t) {\r
+        var array_remove = log4javascript.evalInScope("array_remove");\r
+        var a = ["Marlon", "Ashley", "Darius"];\r
+        array_remove(a, "Darius");\r
+        t.assertEquals(a.join(","), "Marlon,Ashley");\r
+    });\r
+\r
+       s.test("array_remove with empty array test", function(t) {\r
+               var array_remove = log4javascript.evalInScope("array_remove");\r
+               var a = [];\r
+               array_remove(a, "Darius");\r
+               t.assertEquals(a.join(","), "");\r
+       });\r
+\r
+    s.test("Logger logging test", function(t) {\r
+        // Should log since the default level for loggers is DEBUG and\r
+        // the default threshold for appenders is ALL\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 1);\r
+    });\r
+\r
+    s.test("Logger levels test", function(t) {\r
+        var originalLevel = t.logger.getEffectiveLevel();\r
+        t.logger.setLevel(log4javascript.Level.INFO);\r
+        t.logger.debug("TEST");\r
+               t.logger.setLevel(originalLevel);\r
+        t.assertEquals(t.appender.logMessages.length, 0);\r
+    });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 1", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               parentLogger.setLevel(log4javascript.Level.ERROR);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 2", function(t) {\r
+               var grandParentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2.test3");\r
+               grandParentLogger.setLevel(log4javascript.Level.ERROR);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 3", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               parentLogger.setLevel(log4javascript.Level.ERROR);\r
+               childLogger.setLevel(log4javascript.Level.INFO);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.INFO);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel root inheritance test", function(t) {\r
+               var rootLogger = log4javascript.getRootLogger();\r
+               var childLogger = log4javascript.getLogger("test1.test2.test3");\r
+               rootLogger.setLevel(log4javascript.Level.WARN);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.WARN);\r
+       });\r
+\r
+       s.test("Logger null level test", function(t) {\r
+               t.logger.setLevel(null);\r
+               // Should default to root logger level, which is DEBUG\r
+               t.assertEquals(t.logger.getEffectiveLevel(), log4javascript.Level.DEBUG);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 1", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 2", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               childLogger.setAdditivity(false);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 1);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 3", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               childLogger.setAdditivity(false);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               childLogger.setAdditivity(true);\r
+\r
+               childLogger.info("Child logger test message 2");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 2);\r
+       });\r
+\r
+       s.test("Appender threshold test", function(t) {\r
+        t.appender.setThreshold(log4javascript.Level.INFO);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 0);\r
+    });\r
+\r
+    s.test("Basic appender / layout test", function(t) {\r
+        t.logger.debug("TEST");\r
+               t.assertEquals(t.appender.logMessages[0], "TEST");\r
+    });\r
+\r
+       s.test("Appender uniqueness within logger test", function(t) {\r
+               // Add the same appender to the logger for a second time\r
+               t.logger.addAppender(t.appender);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 1);\r
+    });\r
+\r
+       s.test("Logger remove appender test", function(t) {\r
+               t.logger.debug("TEST");\r
+               t.logger.removeAppender(t.appender);\r
+               t.logger.debug("TEST AGAIN");\r
+               t.assertEquals(t.appender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("", function(t) {\r
+               t.logger.debug("TEST");\r
+               t.logger.removeAppender(t.appender);\r
+               t.logger.debug("TEST AGAIN");\r
+               t.assertEquals(t.appender.logMessages.length, 1);\r
+       });\r
+       s.test("SimpleLayout format test", function(t) {\r
+               var layout = new log4javascript.SimpleLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("SimpleLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.SimpleLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");\r
+    });\r
+       s.test("NullLayout format test", function(t) {\r
+               var layout = new log4javascript.NullLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("NullLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.NullLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "TEST");\r
+    });\r
+       s.test("XmlLayout format test", function(t) {\r
+               var layout = new log4javascript.XmlLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("XmlLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.XmlLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("XmlLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.XmlLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<log4javascript:exception>\s*<!\[CDATA\[.*\]\]><\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       var setUpXmlLayoutMillisecondsTest = function(t) {\r
+               t.date = new Date();\r
+               t.timeInMilliseconds = t.date.getTime();\r
+               t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);\r
+               t.milliseconds = t.date.getMilliseconds();\r
+               \r
+               t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
+               t.layout = new log4javascript.XmlLayout();\r
+       }\r
+\r
+       s.test("XmlLayout seconds/milliseconds test 1", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+               // Test default (i.e. timestamps in milliseconds) first\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInMilliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));\r
+       });\r
+       \r
+       s.test("XmlLayout seconds/milliseconds test 2", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+        // Change the global setting\r
+        log4javascript.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        log4javascript.setTimeStampsInMilliseconds(true);\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+\r
+       s.test("XmlLayout seconds/milliseconds test 3", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+        // Change the layout setting\r
+        t.layout.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+       s.test("escapeNewLines test", function(t) {\r
+               var escapeNewLines = log4javascript.evalInScope("escapeNewLines");\r
+               var str = "1\r2\n3\n4\r\n5\r6\r\n7";\r
+               t.assertEquals(escapeNewLines(str), "1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");\r
+       });\r
+\r
+       s.test("JsonLayout format test", function(t) {\r
+               var layout = new log4javascript.JsonLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("JsonLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout JSON validity test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST");\r
+        eval("var o = " + t.appender.logMessages[0]);\r
+        t.assertEquals(o.message, "TEST");\r
+    });\r
+\r
+    s.test("JsonLayout with number type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug(15);\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with object type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug({});\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with boolean type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug(false);\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with quote test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TE\"S\"T");\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       var setUpJsonLayoutMillisecondsTest = function(t) {\r
+               t.date = new Date();\r
+               t.timeInMilliseconds = t.date.getTime();\r
+               t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);\r
+               t.milliseconds = t.date.getMilliseconds();\r
+               \r
+               t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
+               t.layout = new log4javascript.JsonLayout();\r
+       };\r
+\r
+       s.test("JsonLayout seconds/milliseconds test 1", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+               // Test default (i.e. timestamps in milliseconds) first\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');\r
+        t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));\r
+       });\r
+       \r
+       s.test("JsonLayout seconds/milliseconds test 2", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+        // Change the global setting\r
+        log4javascript.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        log4javascript.setTimeStampsInMilliseconds(true);\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+\r
+       s.test("JsonLayout seconds/milliseconds test 3", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+        // Change the layout setting\r
+        t.layout.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+       s.test("HttpPostDataLayout format test", function(t) {\r
+               var layout = new log4javascript.HttpPostDataLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("HttpPostDataLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("HttpPostDataLayout URL encoding test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST +\"1\"");\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("HttpPostDataLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       (function() {\r
+               var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");\r
+               var newLine = log4javascript.evalInScope("newLine");\r
+               var arr = [\r
+                       null,\r
+                       undefined,\r
+                       1.2,\r
+                       "A string",\r
+                       [1, "test"],\r
+                       {\r
+                               a: {\r
+                                       b: 1\r
+                               }\r
+                       }\r
+               ];\r
+\r
+               s.test("Basic formatObjectExpansion array test (depth: 1)", function(t) {\r
+                       t.assertEquals(formatObjectExpansion(arr, 1),\r
+                               "[" + newLine +\r
+                               "  null," + newLine +\r
+                               "  undefined," + newLine +\r
+                               "  1.2," + newLine +\r
+                               "  A string," + newLine +\r
+                               "  1,test," + newLine +\r
+                               "  [object Object]" + newLine +\r
+                               "]"\r
+                       );\r
+               });\r
+\r
+               s.test("Basic formatObjectExpansion array test (depth: 2)", function(t) {\r
+                       t.assertEquals(formatObjectExpansion(arr, 2),\r
+                               "[" + newLine +\r
+                               "  null," + newLine +\r
+                               "  undefined," + newLine +\r
+                               "  1.2," + newLine +\r
+                               "  A string," + newLine +\r
+                               "  [" + newLine +\r
+                               "    1," + newLine +\r
+                               "    test" + newLine +\r
+                               "  ]," + newLine +\r
+                               "  {" + newLine +\r
+                               "    a: [object Object]" + newLine +\r
+                               "  }" + newLine +\r
+                               "]"\r
+                       );\r
+               });\r
+\r
+               s.test("formatObjectExpansion simple object test", function(t) {\r
+                       var obj = {\r
+                               STRING: "A string"\r
+                       };\r
+                       t.assertEquals(formatObjectExpansion(obj, 1), \r
+                               "{" + newLine +\r
+                               "  STRING: A string" + newLine +\r
+                               "}"\r
+                       );\r
+               });\r
+\r
+               s.test("formatObjectExpansion simple circular object test", function(t) {\r
+                       var obj = {};\r
+                       obj.a = obj;\r
+                       \r
+                       t.assertEquals(formatObjectExpansion(obj, 2), \r
+                               "{" + newLine +\r
+                               "  a: [object Object] [already expanded]" + newLine +\r
+                               "}"\r
+                       );\r
+               });\r
+       })();    /* ---------------------------------------------------------- */\r
+\r
+    var getSampleDate = function() {\r
+        var date = new Date();\r
+        date.setFullYear(2006);\r
+        date.setMonth(7);\r
+        date.setDate(30);\r
+        date.setHours(15);\r
+        date.setMinutes(38);\r
+        date.setSeconds(45);\r
+        return date;\r
+    };\r
+\r
+    /* ---------------------------------------------------------- */\r
+\r
+    s.test("String.replace test", function(t) {\r
+        t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");\r
+    });\r
+\r
+       s.test("PatternLayout format test", function(t) {\r
+               var layout = new log4javascript.PatternLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("PatternLayout dates test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("PatternLayout modifiers test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST|  TEST|TEST  |ST|ST|  TEST|ST|TEST  |");\r
+    });\r
+\r
+    s.test("PatternLayout conversion characters test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("PatternLayout message test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%m{1} %m{2}");\r
+        t.appender.setLayout(layout);\r
+        var testObj = {\r
+            strikers: {\r
+                quick: "Marlon"\r
+            }\r
+        };\r
+        t.logger.debug(testObj);\r
+        t.assertEquals("{\r\n  strikers: [object Object]\r\n} {\r\n\  strikers: {\r\n    quick: Marlon\r\n  }\r\n}", t.appender.logMessages[0]);\r
+    });\r
+/*\r
+       s.test("AjaxAppender JsonLayout single message test", function(t) {\r
+               t.async(10000);\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               ajaxAppender.setLayout(new log4javascript.JsonLayout());\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 1);\r
+                               t.assertEquals(arr[0], "TEST");\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug("TEST");\r
+       });\r
+\r
+       s.test("AjaxAppender JsonLayout batched messages test", function(t) {\r
+               t.async(10000);\r
+               var message1 = "TEST 1";\r
+               var message2 = "String with \"lots of 'quotes'\" + plusses in";\r
+               var message3 = "A non-threatening string";\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               ajaxAppender.setLayout(new log4javascript.JsonLayout());\r
+               ajaxAppender.setBatchSize(3);\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 3);\r
+                               t.assertEquals(arr[0], message1);\r
+                               t.assertEquals(arr[1], message2);\r
+                               t.assertEquals(arr[2], message3);\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug(message1);\r
+               t.logger.info(message2);\r
+               t.logger.warn(message3);\r
+       });\r
+\r
+       s.test("AjaxAppender HttpPostDataLayout single message test", function(t) {\r
+               t.async(10000);\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               var testMessage = "TEST +\"1\"";\r
+               ajaxAppender.setLayout(new log4javascript.HttpPostDataLayout());\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 1);\r
+                               t.assertEquals(arr[0], testMessage);\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug(testMessage);\r
+       });\r
+*/\r
+});
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/js/tests/log4javascript_uncompressed.js
new file mode 100644 (file)
index 0000000..55bd2ca
--- /dev/null
@@ -0,0 +1,862 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+function array_contains(arr, val) {\r
+       for (var i = 0; i < arr.length; i++) {\r
+               if (arr[i] == val) {\r
+                       return true;\r
+               }\r
+       }\r
+       return false;\r
+}\r
+\r
+// Recursively checks that obj2's interface contains all of obj1's\r
+// interface (functions and objects only)\r
+function compareObjectInterface(obj1, obj1_name, obj2, obj2_name, namePrefix) {\r
+       if (!namePrefix) {\r
+               namePrefix = "";\r
+       }\r
+       var obj1PropertyNames = new Array();\r
+       for (var i in obj1) {\r
+               if (i != "prototype" && i != "arguments") {\r
+                       obj1PropertyNames.push(i);\r
+               }\r
+       }\r
+       if (obj1 && obj1.prototype && !array_contains(obj1PropertyNames, "prototype")) {\r
+               //obj1PropertyNames.push("prototype");\r
+       }\r
+       for (var j = 0; j < obj1PropertyNames.length; j++) {\r
+               var propertyName = obj1PropertyNames[j];\r
+               if ((typeof obj1[propertyName] == "function" || typeof obj1[propertyName] == "object") && !(obj1[propertyName] instanceof Array)) {\r
+                       var propertyFullyQualifiedName = (namePrefix == "") ? propertyName : namePrefix + "." + propertyName;\r
+                       try {\r
+                               if (typeof obj2[propertyName] == "undefined") {\r
+                                       throw new Error(obj2_name + " does not contain " + propertyFullyQualifiedName + " in " + obj1_name);\r
+                               } else if (typeof obj2[propertyName] != typeof obj1[propertyName]){\r
+                                       throw new Error(obj2_name + "'s " + propertyFullyQualifiedName + " is of the wrong type: " + typeof obj2[propertyName] + " when it is type " + typeof obj1[propertyName] + " in " + obj1_name);\r
+                               } else if (obj1[propertyName] != Function.prototype.apply) {\r
+                                       if (!compareObjectInterface(obj1[propertyName], obj1_name, obj2[propertyName], obj2_name, propertyFullyQualifiedName)) {\r
+                                               throw new Error("Interfaces don't match");\r
+                                       }\r
+                               }\r
+                       } catch(ex) {\r
+                               throw new Error("Exception while checking property name " + propertyFullyQualifiedName + " in " + obj2_name + ": " + ex.message);\r
+                       }\r
+               }\r
+       }\r
+       return true;\r
+};\r
+\r
+// Simply tests a layout for exceptions when formatting\r
+var testLayoutWithVariables = function(layout, t) {\r
+       var emptyObject = {};\r
+       var emptyArray = [];\r
+       var emptyString = "";\r
+       var localUndefined = emptyArray[0];\r
+       var oneLevelObject = {\r
+               "name": "One-level object"\r
+       };\r
+       var twoLevelObject = {\r
+               "name": "Two-level object",\r
+               "data": oneLevelObject\r
+       };\r
+       var threeLevelObject = {\r
+               "name": "Three-level object",\r
+               "data": twoLevelObject\r
+       };\r
+       var anArray = [\r
+               3,\r
+               "stuff",\r
+               true,\r
+               false,\r
+               0,\r
+               null,\r
+               localUndefined,\r
+               3.14,\r
+               function(p) { return "I'm a function"; },\r
+               [1, "things"]\r
+       ];\r
+       var arrayOfTestItems = [emptyObject, emptyString, emptyString, localUndefined, oneLevelObject,\r
+                       twoLevelObject, threeLevelObject, anArray];\r
+\r
+       t.log("Testing layout " + layout)\r
+       for (var i = 0; i < arrayOfTestItems.length; i++) {\r
+               var ex = new Error("Test error");\r
+               var loggingEvent = new log4javascript.LoggingEvent(t.logger, new Date(), log4javascript.Level.INFO,\r
+                               [arrayOfTestItems[i]], null);\r
+               t.log("Formatting", arrayOfTestItems[i], result);\r
+               var result = layout.format(loggingEvent);\r
+               // Now try with an exception\r
+               loggingEvent.exception = ex;\r
+               t.log("Formatting with exception", arrayOfTestItems[i], result);\r
+               result = layout.format(loggingEvent);\r
+       }\r
+};\r
+\r
+xn.test.enableTestDebug = true;\r
+xn.test.enable_log4javascript = false;\r
+\r
+xn.test.suite("log4javascript tests", function(s) {\r
+       log4javascript.logLog.setQuietMode(true);\r
+       var ArrayAppender = function(layout) {\r
+               if (layout) {\r
+                       this.setLayout(layout);\r
+               }\r
+               this.logMessages = [];\r
+       };\r
+\r
+       ArrayAppender.prototype = new log4javascript.Appender();\r
+\r
+       ArrayAppender.prototype.layout = new log4javascript.NullLayout();\r
+\r
+       ArrayAppender.prototype.append = function(loggingEvent) {\r
+               var formattedMessage = this.getLayout().format(loggingEvent);\r
+               if (this.getLayout().ignoresThrowable()) {\r
+                       formattedMessage += loggingEvent.getThrowableStrRep();\r
+               }\r
+               this.logMessages.push(formattedMessage);\r
+       };\r
+\r
+       ArrayAppender.prototype.toString = function() {\r
+               return "[ArrayAppender]";\r
+       };\r
+\r
+    s.setUp = function(t) {\r
+        t.logger = log4javascript.getLogger("test");\r
+               t.logger.removeAllAppenders();\r
+               t.appender = new ArrayAppender();\r
+        t.logger.addAppender(t.appender);\r
+    };\r
+\r
+    s.tearDown = function(t) {\r
+        t.logger.removeAppender(t.appender);\r
+               log4javascript.resetConfiguration();\r
+       };\r
+\r
+    s.test("Stub script interface test", function(t) {\r
+        try {\r
+            compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");\r
+        } catch (ex) {\r
+            t.fail(ex);\r
+        }\r
+    });\r
+\r
+       s.test("Disable log4javascript test", function(t) {\r
+               log4javascript.setEnabled(false);\r
+               t.logger.debug("TEST");\r
+               t.assertEquals(t.appender.logMessages.length, 0);\r
+               log4javascript.setEnabled(true);\r
+       });\r
+\r
+    s.test("Array.splice test 1", function(t) {\r
+        var a = ["Marlon", "Ashley", "Darius", "Lloyd"];\r
+        var deletedItems = a.splice(1, 2);\r
+        t.assertEquals(a.join(","), "Marlon,Lloyd");\r
+        t.assertEquals(deletedItems.join(","), "Ashley,Darius");\r
+    });\r
+\r
+    s.test("Array.splice test 2", function(t) {\r
+        var a = ["Marlon", "Ashley", "Darius", "Lloyd"];\r
+        var deletedItems = a.splice(1, 1, "Malky", "Jay");\r
+        t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");\r
+        t.assertEquals(deletedItems.join(","), "Ashley");\r
+    });\r
+\r
+    s.test("array_remove test", function(t) {\r
+        var array_remove = log4javascript.evalInScope("array_remove");\r
+        var a = ["Marlon", "Ashley", "Darius"];\r
+        array_remove(a, "Darius");\r
+        t.assertEquals(a.join(","), "Marlon,Ashley");\r
+    });\r
+\r
+       s.test("array_remove with empty array test", function(t) {\r
+               var array_remove = log4javascript.evalInScope("array_remove");\r
+               var a = [];\r
+               array_remove(a, "Darius");\r
+               t.assertEquals(a.join(","), "");\r
+       });\r
+\r
+    s.test("Logger logging test", function(t) {\r
+        // Should log since the default level for loggers is DEBUG and\r
+        // the default threshold for appenders is ALL\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 1);\r
+    });\r
+\r
+    s.test("Logger levels test", function(t) {\r
+        var originalLevel = t.logger.getEffectiveLevel();\r
+        t.logger.setLevel(log4javascript.Level.INFO);\r
+        t.logger.debug("TEST");\r
+               t.logger.setLevel(originalLevel);\r
+        t.assertEquals(t.appender.logMessages.length, 0);\r
+    });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 1", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               parentLogger.setLevel(log4javascript.Level.ERROR);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 2", function(t) {\r
+               var grandParentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2.test3");\r
+               grandParentLogger.setLevel(log4javascript.Level.ERROR);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.ERROR);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel inheritance test 3", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               parentLogger.setLevel(log4javascript.Level.ERROR);\r
+               childLogger.setLevel(log4javascript.Level.INFO);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.INFO);\r
+       });\r
+\r
+       s.test("Logger getEffectiveLevel root inheritance test", function(t) {\r
+               var rootLogger = log4javascript.getRootLogger();\r
+               var childLogger = log4javascript.getLogger("test1.test2.test3");\r
+               rootLogger.setLevel(log4javascript.Level.WARN);\r
+               t.assertEquals(childLogger.getEffectiveLevel(), log4javascript.Level.WARN);\r
+       });\r
+\r
+       s.test("Logger null level test", function(t) {\r
+               t.logger.setLevel(null);\r
+               // Should default to root logger level, which is DEBUG\r
+               t.assertEquals(t.logger.getEffectiveLevel(), log4javascript.Level.DEBUG);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 1", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 2", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               childLogger.setAdditivity(false);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 1);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("Logger appender additivity test 3", function(t) {\r
+               var parentLogger = log4javascript.getLogger("test1");\r
+               var childLogger = log4javascript.getLogger("test1.test2");\r
+               var parentLoggerAppender = new ArrayAppender();\r
+               var childLoggerAppender = new ArrayAppender();\r
+\r
+               parentLogger.addAppender(parentLoggerAppender);\r
+               childLogger.addAppender(childLoggerAppender);\r
+\r
+               childLogger.setAdditivity(false);\r
+\r
+               parentLogger.info("Parent logger test message");\r
+               childLogger.info("Child logger test message");\r
+\r
+               childLogger.setAdditivity(true);\r
+\r
+               childLogger.info("Child logger test message 2");\r
+\r
+               t.assertEquals(parentLoggerAppender.logMessages.length, 2);\r
+               t.assertEquals(childLoggerAppender.logMessages.length, 2);\r
+       });\r
+\r
+       s.test("Appender threshold test", function(t) {\r
+        t.appender.setThreshold(log4javascript.Level.INFO);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 0);\r
+    });\r
+\r
+    s.test("Basic appender / layout test", function(t) {\r
+        t.logger.debug("TEST");\r
+               t.assertEquals(t.appender.logMessages[0], "TEST");\r
+    });\r
+\r
+       s.test("Appender uniqueness within logger test", function(t) {\r
+               // Add the same appender to the logger for a second time\r
+               t.logger.addAppender(t.appender);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages.length, 1);\r
+    });\r
+\r
+       s.test("Logger remove appender test", function(t) {\r
+               t.logger.debug("TEST");\r
+               t.logger.removeAppender(t.appender);\r
+               t.logger.debug("TEST AGAIN");\r
+               t.assertEquals(t.appender.logMessages.length, 1);\r
+       });\r
+\r
+       s.test("", function(t) {\r
+               t.logger.debug("TEST");\r
+               t.logger.removeAppender(t.appender);\r
+               t.logger.debug("TEST AGAIN");\r
+               t.assertEquals(t.appender.logMessages.length, 1);\r
+       });\r
+       s.test("SimpleLayout format test", function(t) {\r
+               var layout = new log4javascript.SimpleLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("SimpleLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.SimpleLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");\r
+    });\r
+       s.test("NullLayout format test", function(t) {\r
+               var layout = new log4javascript.NullLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("NullLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.NullLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "TEST");\r
+    });\r
+       s.test("XmlLayout format test", function(t) {\r
+               var layout = new log4javascript.XmlLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("XmlLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.XmlLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("XmlLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.XmlLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^<log4javascript:event logger="test" timestamp="\d+" level="DEBUG">\s*<log4javascript:message><!\[CDATA\[TEST\]\]><\/log4javascript:message>\s*<log4javascript:exception>\s*<!\[CDATA\[.*\]\]><\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       var setUpXmlLayoutMillisecondsTest = function(t) {\r
+               t.date = new Date();\r
+               t.timeInMilliseconds = t.date.getTime();\r
+               t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);\r
+               t.milliseconds = t.date.getMilliseconds();\r
+               \r
+               t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
+               t.layout = new log4javascript.XmlLayout();\r
+       }\r
+\r
+       s.test("XmlLayout seconds/milliseconds test 1", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+               // Test default (i.e. timestamps in milliseconds) first\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInMilliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));\r
+       });\r
+       \r
+       s.test("XmlLayout seconds/milliseconds test 2", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+        // Change the global setting\r
+        log4javascript.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        log4javascript.setTimeStampsInMilliseconds(true);\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+\r
+       s.test("XmlLayout seconds/milliseconds test 3", function(t) {\r
+               setUpXmlLayoutMillisecondsTest(t);\r
+\r
+        // Change the layout setting\r
+        t.layout.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        var regex = new RegExp('^<log4javascript:event logger="test" timestamp="' + t.timeInSeconds + '" milliseconds="' + t.milliseconds + '" level="DEBUG">\\s*<log4javascript:message><!\\[CDATA\\[TEST\\]\\]></log4javascript:message>\\s*</log4javascript:event>\\s*$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+       s.test("escapeNewLines test", function(t) {\r
+               var escapeNewLines = log4javascript.evalInScope("escapeNewLines");\r
+               var str = "1\r2\n3\n4\r\n5\r6\r\n7";\r
+               t.assertEquals(escapeNewLines(str), "1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");\r
+       });\r
+\r
+       s.test("JsonLayout format test", function(t) {\r
+               var layout = new log4javascript.JsonLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("JsonLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout JSON validity test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST");\r
+        eval("var o = " + t.appender.logMessages[0]);\r
+        t.assertEquals(o.message, "TEST");\r
+    });\r
+\r
+    s.test("JsonLayout with number type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug(15);\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with object type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug({});\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with boolean type message test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug(false);\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with quote test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TE\"S\"T");\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("JsonLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.JsonLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       var setUpJsonLayoutMillisecondsTest = function(t) {\r
+               t.date = new Date();\r
+               t.timeInMilliseconds = t.date.getTime();\r
+               t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);\r
+               t.milliseconds = t.date.getMilliseconds();\r
+               \r
+               t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);\r
+               t.layout = new log4javascript.JsonLayout();\r
+       };\r
+\r
+       s.test("JsonLayout seconds/milliseconds test 1", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+               // Test default (i.e. timestamps in milliseconds) first\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');\r
+        t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));\r
+       });\r
+       \r
+       s.test("JsonLayout seconds/milliseconds test 2", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+        // Change the global setting\r
+        log4javascript.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        log4javascript.setTimeStampsInMilliseconds(true);\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+\r
+       s.test("JsonLayout seconds/milliseconds test 3", function(t) {\r
+               setUpJsonLayoutMillisecondsTest(t);\r
+\r
+        // Change the layout setting\r
+        t.layout.setTimeStampsInMilliseconds(false);\r
+        var formatted = t.layout.format(t.loggingEvent);\r
+        var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');\r
+        t.assertRegexMatches(regex, formatted);\r
+       });\r
+       s.test("HttpPostDataLayout format test", function(t) {\r
+               var layout = new log4javascript.HttpPostDataLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("HttpPostDataLayout test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("HttpPostDataLayout URL encoding test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST +\"1\"");\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("HttpPostDataLayout with exception test", function(t) {\r
+        t.appender.setLayout(new log4javascript.HttpPostDataLayout());\r
+        t.logger.debug("TEST", new Error("Test error"));\r
+        t.assertRegexMatches(/^logger=test&timestamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+       (function() {\r
+               var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");\r
+               var newLine = log4javascript.evalInScope("newLine");\r
+               var arr = [\r
+                       null,\r
+                       undefined,\r
+                       1.2,\r
+                       "A string",\r
+                       [1, "test"],\r
+                       {\r
+                               a: {\r
+                                       b: 1\r
+                               }\r
+                       }\r
+               ];\r
+\r
+               s.test("Basic formatObjectExpansion array test (depth: 1)", function(t) {\r
+                       t.assertEquals(formatObjectExpansion(arr, 1),\r
+                               "[" + newLine +\r
+                               "  null," + newLine +\r
+                               "  undefined," + newLine +\r
+                               "  1.2," + newLine +\r
+                               "  A string," + newLine +\r
+                               "  1,test," + newLine +\r
+                               "  [object Object]" + newLine +\r
+                               "]"\r
+                       );\r
+               });\r
+\r
+               s.test("Basic formatObjectExpansion array test (depth: 2)", function(t) {\r
+                       t.assertEquals(formatObjectExpansion(arr, 2),\r
+                               "[" + newLine +\r
+                               "  null," + newLine +\r
+                               "  undefined," + newLine +\r
+                               "  1.2," + newLine +\r
+                               "  A string," + newLine +\r
+                               "  [" + newLine +\r
+                               "    1," + newLine +\r
+                               "    test" + newLine +\r
+                               "  ]," + newLine +\r
+                               "  {" + newLine +\r
+                               "    a: [object Object]" + newLine +\r
+                               "  }" + newLine +\r
+                               "]"\r
+                       );\r
+               });\r
+\r
+               s.test("formatObjectExpansion simple object test", function(t) {\r
+                       var obj = {\r
+                               STRING: "A string"\r
+                       };\r
+                       t.assertEquals(formatObjectExpansion(obj, 1), \r
+                               "{" + newLine +\r
+                               "  STRING: A string" + newLine +\r
+                               "}"\r
+                       );\r
+               });\r
+\r
+               s.test("formatObjectExpansion simple circular object test", function(t) {\r
+                       var obj = {};\r
+                       obj.a = obj;\r
+                       \r
+                       t.assertEquals(formatObjectExpansion(obj, 2), \r
+                               "{" + newLine +\r
+                               "  a: [object Object] [already expanded]" + newLine +\r
+                               "}"\r
+                       );\r
+               });\r
+       })();    /* ---------------------------------------------------------- */\r
+\r
+    var getSampleDate = function() {\r
+        var date = new Date();\r
+        date.setFullYear(2006);\r
+        date.setMonth(7);\r
+        date.setDate(30);\r
+        date.setHours(15);\r
+        date.setMinutes(38);\r
+        date.setSeconds(45);\r
+        return date;\r
+    };\r
+\r
+    /* ---------------------------------------------------------- */\r
+\r
+    s.test("String.replace test", function(t) {\r
+        t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");\r
+    });\r
+\r
+       s.test("PatternLayout format test", function(t) {\r
+               var layout = new log4javascript.PatternLayout();\r
+               testLayoutWithVariables(layout, t);\r
+       });\r
+\r
+    s.test("PatternLayout dates test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("PatternLayout modifiers test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST|  TEST|TEST  |ST|ST|  TEST|ST|TEST  |");\r
+    });\r
+\r
+    s.test("PatternLayout conversion characters test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");\r
+        t.appender.setLayout(layout);\r
+        t.logger.debug("TEST");\r
+        t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);\r
+    });\r
+\r
+    s.test("PatternLayout message test", function(t) {\r
+        var layout = new log4javascript.PatternLayout("%m{1} %m{2}");\r
+        t.appender.setLayout(layout);\r
+        var testObj = {\r
+            strikers: {\r
+                quick: "Marlon"\r
+            }\r
+        };\r
+        t.logger.debug(testObj);\r
+        t.assertEquals("{\r\n  strikers: [object Object]\r\n} {\r\n\  strikers: {\r\n    quick: Marlon\r\n  }\r\n}", t.appender.logMessages[0]);\r
+    });\r
+       // Tests for exceptions when logging\r
+       s.test("Logging/grouping test", function(t) {\r
+               var browserConsoleAppender = new log4javascript.BrowserConsoleAppender();\r
+               t.logger.addAppender(browserConsoleAppender);\r
+\r
+               // Test each level\r
+               t.logger.trace("TEST TRACE");\r
+               t.logger.debug("TEST DEBUG");\r
+               t.logger.info("TEST INFO");\r
+               t.logger.warn("TEST WARN");\r
+               t.logger.error("TEST ERROR");\r
+               t.logger.fatal("TEST FATAL");\r
+               \r
+               // Test with exception\r
+               t.logger.fatal("TEST FATAL", new Error("Fake error"));\r
+               \r
+               // Test multiple messages\r
+               t.logger.info("TEST INFO", "Second message", ["a", "b", "c"]);\r
+               \r
+               // Test groups\r
+               t.logger.group("TEST GROUP");\r
+               t.logger.info("TEST INFO");\r
+               t.logger.groupEnd("TEST GROUP");\r
+               t.logger.info("TEST INFO");\r
+               \r
+               t.logger.removeAppender(browserConsoleAppender);\r
+       });\r
+\r
+/*\r
+       s.test("AjaxAppender JsonLayout single message test", function(t) {\r
+               t.async(10000);\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               ajaxAppender.setLayout(new log4javascript.JsonLayout());\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 1);\r
+                               t.assertEquals(arr[0], "TEST");\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug("TEST");\r
+       });\r
+\r
+       s.test("AjaxAppender JsonLayout batched messages test", function(t) {\r
+               t.async(10000);\r
+               var message1 = "TEST 1";\r
+               var message2 = "String with \"lots of 'quotes'\" + plusses in";\r
+               var message3 = "A non-threatening string";\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               ajaxAppender.setLayout(new log4javascript.JsonLayout());\r
+               ajaxAppender.setBatchSize(3);\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 3);\r
+                               t.assertEquals(arr[0], message1);\r
+                               t.assertEquals(arr[1], message2);\r
+                               t.assertEquals(arr[2], message3);\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug(message1);\r
+               t.logger.info(message2);\r
+               t.logger.warn(message3);\r
+       });\r
+\r
+       s.test("AjaxAppender HttpPostDataLayout single message test", function(t) {\r
+               t.async(10000);\r
+               // Create and add an Ajax appender\r
+               var ajaxAppender = new log4javascript.AjaxAppender("../log4javascript.do");\r
+               var testMessage = "TEST +\"1\"";\r
+               ajaxAppender.setLayout(new log4javascript.HttpPostDataLayout());\r
+               ajaxAppender.setRequestSuccessCallback(\r
+                       function(xmlHttp) {\r
+                               // Response comes back as JSON array of messages logged\r
+                               var jsonResponse = xmlHttp.responseText;\r
+                               var arr = eval(jsonResponse);\r
+                               t.assertEquals(arr.length, 1);\r
+                               t.assertEquals(arr[0], testMessage);\r
+                               t.succeed();\r
+                       }\r
+               );\r
+               ajaxAppender.setFailCallback(\r
+                       function(msg) {\r
+                               t.fail(msg);\r
+                               ajaxErrorMessage = msg;\r
+                       }\r
+               );\r
+               t.logger.addAppender(ajaxAppender);\r
+               t.logger.debug(testMessage);\r
+       });\r
+*/\r
+       var testConsoleAppender = function(t, appender) {\r
+               var timeoutCallback = function() {\r
+                       //alert("Failed. Debug messages follow.");\r
+                       //log4javascript.logLog.displayDebug();\r
+                       return (windowLoaded ? "Timed out while waiting for messages to appear" :\r
+                                  "Timed out while waiting for window to load") + ". Debug messages: " +\r
+                                  log4javascript.logLog.debugMessages.join("\r\n");\r
+               }\r
+\r
+               t.async(60000, timeoutCallback);\r
+\r
+               var windowLoaded = false;\r
+               var domChecked = false;\r
+\r
+               // Set a timeout to allow the pop-up to appear\r
+               var onLoadHandler = function() {\r
+                       log4javascript.logLog.debug("onLoadHandler");\r
+                       windowLoaded = true;\r
+                       var win = appender.getConsoleWindow();\r
+\r
+                       if (win && win.loaded) {\r
+                               // Check that the log container element contains the log message. Since\r
+                               // the console window waits 100 milliseconds before actually rendering the\r
+                               // message as a DOM element, we need to use a timer\r
+                               var checkDom = function() {\r
+                                       log4javascript.logLog.debug("checkDom");\r
+                                       domChecked = true;\r
+                                       var logContainer = win.logMainContainer;\r
+                                       if (logContainer.hasChildNodes()) {\r
+                                               if (logContainer.innerHTML.indexOf("TEST MESSAGE") == -1) {\r
+                                                       appender.close();\r
+                                                       t.fail("Log message not correctly logged (log container innerHTML: " + logContainer.innerHTML + ")");\r
+                                               } else {\r
+                                                       t.assert(appender.isVisible());\r
+                                                       appender.close();\r
+                                                       t.assert(!appender.isVisible());\r
+                                                       t.succeed();\r
+                                               }\r
+                                       } else {\r
+                                               appender.close();\r
+                                               t.fail("Console has no log messages");\r
+                                       }\r
+                               }\r
+                               window.setTimeout(checkDom, 300);\r
+                       } else {\r
+                               appender.close();\r
+                               t.fail("Console mistakenly raised load event");\r
+                       }\r
+               }\r
+\r
+               appender.addEventListener("load", onLoadHandler);\r
+               t.logger.addAppender(appender);\r
+               t.logger.debug("TEST MESSAGE");\r
+       };\r
+\r
+       s.test("InlineAppender test", function(t) {\r
+               var inlineAppender = new log4javascript.InlineAppender();\r
+               inlineAppender.setInitiallyMinimized(false);\r
+               inlineAppender.setNewestMessageAtTop(false);\r
+               inlineAppender.setScrollToLatestMessage(true);\r
+               inlineAppender.setWidth(600);\r
+               inlineAppender.setHeight(200);\r
+\r
+               testConsoleAppender(t, inlineAppender);\r
+       });\r
+\r
+       s.test("InPageAppender with separate console HTML file test", function(t) {\r
+               var inPageAppender = new log4javascript.InPageAppender();\r
+               inPageAppender.setInitiallyMinimized(false);\r
+               inPageAppender.setNewestMessageAtTop(false);\r
+               inPageAppender.setScrollToLatestMessage(true);\r
+               inPageAppender.setUseDocumentWrite(false);\r
+               inPageAppender.setWidth(600);\r
+               inPageAppender.setHeight(200);\r
+\r
+               testConsoleAppender(t, inPageAppender);\r
+       });\r
+\r
+       s.test("PopUpAppender test", function(t) {\r
+               var popUpAppender = new log4javascript.PopUpAppender();\r
+               popUpAppender.setFocusPopUp(true);\r
+               popUpAppender.setUseOldPopUp(false);\r
+               popUpAppender.setNewestMessageAtTop(false);\r
+               popUpAppender.setScrollToLatestMessage(true);\r
+               popUpAppender.setComplainAboutPopUpBlocking(false);\r
+               popUpAppender.setWidth(600);\r
+               popUpAppender.setHeight(200);\r
+\r
+               testConsoleAppender(t, popUpAppender);\r
+               \r
+               \r
+       });\r
+\r
+       s.test("PopUpAppender with separate console HTML file test", function(t) {\r
+               var popUpAppender = new log4javascript.PopUpAppender();\r
+               popUpAppender.setFocusPopUp(true);\r
+               popUpAppender.setUseOldPopUp(false);\r
+               popUpAppender.setNewestMessageAtTop(false);\r
+               popUpAppender.setScrollToLatestMessage(true);\r
+               popUpAppender.setComplainAboutPopUpBlocking(false);\r
+               popUpAppender.setUseDocumentWrite(false);\r
+               popUpAppender.setWidth(600);\r
+               popUpAppender.setHeight(200);\r
+\r
+               testConsoleAppender(t, popUpAppender);\r
+       });\r
+});
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/license.txt b/planetstack/core/static/log4javascript-1.4.6/license.txt
new file mode 100644 (file)
index 0000000..29f81d8
--- /dev/null
@@ -0,0 +1,201 @@
+                                 Apache License\r
+                           Version 2.0, January 2004\r
+                        http://www.apache.org/licenses/\r
+\r
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r
+\r
+   1. Definitions.\r
+\r
+      "License" shall mean the terms and conditions for use, reproduction,\r
+      and distribution as defined by Sections 1 through 9 of this document.\r
+\r
+      "Licensor" shall mean the copyright owner or entity authorized by\r
+      the copyright owner that is granting the License.\r
+\r
+      "Legal Entity" shall mean the union of the acting entity and all\r
+      other entities that control, are controlled by, or are under common\r
+      control with that entity. For the purposes of this definition,\r
+      "control" means (i) the power, direct or indirect, to cause the\r
+      direction or management of such entity, whether by contract or\r
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r
+      outstanding shares, or (iii) beneficial ownership of such entity.\r
+\r
+      "You" (or "Your") shall mean an individual or Legal Entity\r
+      exercising permissions granted by this License.\r
+\r
+      "Source" form shall mean the preferred form for making modifications,\r
+      including but not limited to software source code, documentation\r
+      source, and configuration files.\r
+\r
+      "Object" form shall mean any form resulting from mechanical\r
+      transformation or translation of a Source form, including but\r
+      not limited to compiled object code, generated documentation,\r
+      and conversions to other media types.\r
+\r
+      "Work" shall mean the work of authorship, whether in Source or\r
+      Object form, made available under the License, as indicated by a\r
+      copyright notice that is included in or attached to the work\r
+      (an example is provided in the Appendix below).\r
+\r
+      "Derivative Works" shall mean any work, whether in Source or Object\r
+      form, that is based on (or derived from) the Work and for which the\r
+      editorial revisions, annotations, elaborations, or other modifications\r
+      represent, as a whole, an original work of authorship. For the purposes\r
+      of this License, Derivative Works shall not include works that remain\r
+      separable from, or merely link (or bind by name) to the interfaces of,\r
+      the Work and Derivative Works thereof.\r
+\r
+      "Contribution" shall mean any work of authorship, including\r
+      the original version of the Work and any modifications or additions\r
+      to that Work or Derivative Works thereof, that is intentionally\r
+      submitted to Licensor for inclusion in the Work by the copyright owner\r
+      or by an individual or Legal Entity authorized to submit on behalf of\r
+      the copyright owner. For the purposes of this definition, "submitted"\r
+      means any form of electronic, verbal, or written communication sent\r
+      to the Licensor or its representatives, including but not limited to\r
+      communication on electronic mailing lists, source code control systems,\r
+      and issue tracking systems that are managed by, or on behalf of, the\r
+      Licensor for the purpose of discussing and improving the Work, but\r
+      excluding communication that is conspicuously marked or otherwise\r
+      designated in writing by the copyright owner as "Not a Contribution."\r
+\r
+      "Contributor" shall mean Licensor and any individual or Legal Entity\r
+      on behalf of whom a Contribution has been received by Licensor and\r
+      subsequently incorporated within the Work.\r
+\r
+   2. Grant of Copyright License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      copyright license to reproduce, prepare Derivative Works of,\r
+      publicly display, publicly perform, sublicense, and distribute the\r
+      Work and such Derivative Works in Source or Object form.\r
+\r
+   3. Grant of Patent License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      (except as stated in this section) patent license to make, have made,\r
+      use, offer to sell, sell, import, and otherwise transfer the Work,\r
+      where such license applies only to those patent claims licensable\r
+      by such Contributor that are necessarily infringed by their\r
+      Contribution(s) alone or by combination of their Contribution(s)\r
+      with the Work to which such Contribution(s) was submitted. If You\r
+      institute patent litigation against any entity (including a\r
+      cross-claim or counterclaim in a lawsuit) alleging that the Work\r
+      or a Contribution incorporated within the Work constitutes direct\r
+      or contributory patent infringement, then any patent licenses\r
+      granted to You under this License for that Work shall terminate\r
+      as of the date such litigation is filed.\r
+\r
+   4. Redistribution. You may reproduce and distribute copies of the\r
+      Work or Derivative Works thereof in any medium, with or without\r
+      modifications, and in Source or Object form, provided that You\r
+      meet the following conditions:\r
+\r
+      (a) You must give any other recipients of the Work or\r
+          Derivative Works a copy of this License; and\r
+\r
+      (b) You must cause any modified files to carry prominent notices\r
+          stating that You changed the files; and\r
+\r
+      (c) You must retain, in the Source form of any Derivative Works\r
+          that You distribute, all copyright, patent, trademark, and\r
+          attribution notices from the Source form of the Work,\r
+          excluding those notices that do not pertain to any part of\r
+          the Derivative Works; and\r
+\r
+      (d) If the Work includes a "NOTICE" text file as part of its\r
+          distribution, then any Derivative Works that You distribute must\r
+          include a readable copy of the attribution notices contained\r
+          within such NOTICE file, excluding those notices that do not\r
+          pertain to any part of the Derivative Works, in at least one\r
+          of the following places: within a NOTICE text file distributed\r
+          as part of the Derivative Works; within the Source form or\r
+          documentation, if provided along with the Derivative Works; or,\r
+          within a display generated by the Derivative Works, if and\r
+          wherever such third-party notices normally appear. The contents\r
+          of the NOTICE file are for informational purposes only and\r
+          do not modify the License. You may add Your own attribution\r
+          notices within Derivative Works that You distribute, alongside\r
+          or as an addendum to the NOTICE text from the Work, provided\r
+          that such additional attribution notices cannot be construed\r
+          as modifying the License.\r
+\r
+      You may add Your own copyright statement to Your modifications and\r
+      may provide additional or different license terms and conditions\r
+      for use, reproduction, or distribution of Your modifications, or\r
+      for any such Derivative Works as a whole, provided Your use,\r
+      reproduction, and distribution of the Work otherwise complies with\r
+      the conditions stated in this License.\r
+\r
+   5. Submission of Contributions. Unless You explicitly state otherwise,\r
+      any Contribution intentionally submitted for inclusion in the Work\r
+      by You to the Licensor shall be under the terms and conditions of\r
+      this License, without any additional terms or conditions.\r
+      Notwithstanding the above, nothing herein shall supersede or modify\r
+      the terms of any separate license agreement you may have executed\r
+      with Licensor regarding such Contributions.\r
+\r
+   6. Trademarks. This License does not grant permission to use the trade\r
+      names, trademarks, service marks, or product names of the Licensor,\r
+      except as required for reasonable and customary use in describing the\r
+      origin of the Work and reproducing the content of the NOTICE file.\r
+\r
+   7. Disclaimer of Warranty. Unless required by applicable law or\r
+      agreed to in writing, Licensor provides the Work (and each\r
+      Contributor provides its Contributions) on an "AS IS" BASIS,\r
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r
+      implied, including, without limitation, any warranties or conditions\r
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r
+      PARTICULAR PURPOSE. You are solely responsible for determining the\r
+      appropriateness of using or redistributing the Work and assume any\r
+      risks associated with Your exercise of permissions under this License.\r
+\r
+   8. Limitation of Liability. In no event and under no legal theory,\r
+      whether in tort (including negligence), contract, or otherwise,\r
+      unless required by applicable law (such as deliberate and grossly\r
+      negligent acts) or agreed to in writing, shall any Contributor be\r
+      liable to You for damages, including any direct, indirect, special,\r
+      incidental, or consequential damages of any character arising as a\r
+      result of this License or out of the use or inability to use the\r
+      Work (including but not limited to damages for loss of goodwill,\r
+      work stoppage, computer failure or malfunction, or any and all\r
+      other commercial damages or losses), even if such Contributor\r
+      has been advised of the possibility of such damages.\r
+\r
+   9. Accepting Warranty or Additional Liability. While redistributing\r
+      the Work or Derivative Works thereof, You may choose to offer,\r
+      and charge a fee for, acceptance of support, warranty, indemnity,\r
+      or other liability obligations and/or rights consistent with this\r
+      License. However, in accepting such obligations, You may act only\r
+      on Your own behalf and on Your sole responsibility, not on behalf\r
+      of any other Contributor, and only if You agree to indemnify,\r
+      defend, and hold each Contributor harmless for any liability\r
+      incurred by, or claims asserted against, such Contributor by reason\r
+      of your accepting any such warranty or additional liability.\r
+\r
+   END OF TERMS AND CONDITIONS\r
+\r
+   APPENDIX: How to apply the Apache License to your work.\r
+\r
+      To apply the Apache License to your work, attach the following\r
+      boilerplate notice, with the fields enclosed by brackets "[]"\r
+      replaced with your own identifying information. (Don't include\r
+      the brackets!)  The text should be enclosed in the appropriate\r
+      comment syntax for the file format. We also recommend that a\r
+      file or class name and description of purpose be included on the\r
+      same "printed page" as the copyright notice for easier\r
+      identification within third-party archives.\r
+\r
+   Copyright [yyyy] [name of copyright owner]\r
+\r
+   Licensed under the Apache License, Version 2.0 (the "License");\r
+   you may not use this file except in compliance with the License.\r
+   You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/log4javascript.js b/planetstack/core/static/log4javascript-1.4.6/log4javascript.js
new file mode 100644 (file)
index 0000000..042daa9
--- /dev/null
@@ -0,0 +1,274 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+\r
+if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}\r
+return this.length;};}\r
+if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}\r
+this.length=this.length-1;return firstItem;}};}\r
+if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}\r
+var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}\r
+return itemsDeleted;};}\r
+var log4javascript=(function(){function isUndefined(obj){return typeof obj=="undefined";}\r
+function EventSupport(){}\r
+EventSupport.prototype={eventTypes:[],eventListeners:{},setEventTypes:function(eventTypesParam){if(eventTypesParam instanceof Array){this.eventTypes=eventTypesParam;this.eventListeners={};for(var i=0,len=this.eventTypes.length;i<len;i++){this.eventListeners[this.eventTypes[i]]=[];}}else{handleError("log4javascript.EventSupport ["+this+"]: setEventTypes: eventTypes parameter must be an Array");}},addEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: addEventListener: no event called '"+eventType+"'");}\r
+this.eventListeners[eventType].push(listener);}else{handleError("log4javascript.EventSupport ["+this+"]: addEventListener: listener must be a function");}},removeEventListener:function(eventType,listener){if(typeof listener=="function"){if(!array_contains(this.eventTypes,eventType)){handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: no event called '"+eventType+"'");}\r
+array_remove(this.eventListeners[eventType],listener);}else{handleError("log4javascript.EventSupport ["+this+"]: removeEventListener: listener must be a function");}},dispatchEvent:function(eventType,eventArgs){if(array_contains(this.eventTypes,eventType)){var listeners=this.eventListeners[eventType];for(var i=0,len=listeners.length;i<len;i++){listeners[i](this,eventType,eventArgs);}}else{handleError("log4javascript.EventSupport ["+this+"]: dispatchEvent: no event called '"+eventType+"'");}}};var applicationStartDate=new Date();var uniqueId="log4javascript_"+applicationStartDate.getTime()+"_"+\r
+Math.floor(Math.random()*100000000);var emptyFunction=function(){};var newLine="\r\n";var pageLoaded=false;function Log4JavaScript(){}\r
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript.version="1.4.6";log4javascript.edition="log4javascript";function toStr(obj){if(obj&&obj.toString){return obj.toString();}else{return String(obj);}}\r
+function getExceptionMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}else{return toStr(ex);}}\r
+function getUrlFileName(url){var lastSlashIndex=Math.max(url.lastIndexOf("/"),url.lastIndexOf("\\"));return url.substr(lastSlashIndex+1);}\r
+function getExceptionStringRep(ex){if(ex){var exStr="Exception: "+getExceptionMessage(ex);try{if(ex.lineNumber){exStr+=" on line number "+ex.lineNumber;}\r
+if(ex.fileName){exStr+=" in file "+getUrlFileName(ex.fileName);}}catch(localEx){logLog.warn("Unable to obtain file and line information for error");}\r
+if(showStackTraces&&ex.stack){exStr+=newLine+"Stack trace:"+newLine+ex.stack;}\r
+return exStr;}\r
+return null;}\r
+function bool(obj){return Boolean(obj);}\r
+function trim(str){return str.replace(/^\s+/,"").replace(/\s+$/,"");}\r
+function splitIntoLines(text){var text2=text.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return text2.split("\n");}\r
+var urlEncode=(typeof window.encodeURIComponent!="undefined")?function(str){return encodeURIComponent(str);}:function(str){return escape(str).replace(/\+/g,"%2B").replace(/"/g,"%22").replace(/'/g,"%27").replace(/\//g,"%2F").replace(/=/g,"%3D");};var urlDecode=(typeof window.decodeURIComponent!="undefined")?function(str){return decodeURIComponent(str);}:function(str){return unescape(str).replace(/%2B/g,"+").replace(/%22/g,"\"").replace(/%27/g,"'").replace(/%2F/g,"/").replace(/%3D/g,"=");};function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}\r
+if(index>=0){arr.splice(index,1);return true;}else{return false;}}\r
+function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}\r
+return false;}\r
+function extractBooleanFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return bool(param);}}\r
+function extractStringFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{return String(param);}}\r
+function extractIntFromParam(param,defaultValue){if(isUndefined(param)){return defaultValue;}else{try{var value=parseInt(param,10);return isNaN(value)?defaultValue:value;}catch(ex){logLog.warn("Invalid int param "+param,ex);return defaultValue;}}}\r
+function extractFunctionFromParam(param,defaultValue){if(typeof param=="function"){return param;}else{return defaultValue;}}\r
+function isError(err){return(err instanceof Error);}\r
+if(!Function.prototype.apply){Function.prototype.apply=function(obj,args){var methodName="__apply__";if(typeof obj[methodName]!="undefined"){methodName+=String(Math.random()).substr(2);}\r
+obj[methodName]=this;var argsStrings=[];for(var i=0,len=args.length;i<len;i++){argsStrings[i]="args["+i+"]";}\r
+var script="obj."+methodName+"("+argsStrings.join(",")+")";var returnValue=eval(script);delete obj[methodName];return returnValue;};}\r
+if(!Function.prototype.call){Function.prototype.call=function(obj){var args=[];for(var i=1,len=arguments.length;i<len;i++){args[i-1]=arguments[i];}\r
+return this.apply(obj,args);};}\r
+function getListenersPropertyName(eventName){return"__log4javascript_listeners__"+eventName;}\r
+function addEvent(node,eventName,listener,useCapture,win){win=win?win:window;if(node.addEventListener){node.addEventListener(eventName,listener,useCapture);}else if(node.attachEvent){node.attachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(!node[propertyName]){node[propertyName]=[];node["on"+eventName]=function(evt){evt=getEvent(evt,win);var listenersPropertyName=getListenersPropertyName(eventName);var listeners=this[listenersPropertyName].concat([]);var currentListener;while((currentListener=listeners.shift())){currentListener.call(this,evt);}};}\r
+node[propertyName].push(listener);}}\r
+function removeEvent(node,eventName,listener,useCapture){if(node.removeEventListener){node.removeEventListener(eventName,listener,useCapture);}else if(node.detachEvent){node.detachEvent("on"+eventName,listener);}else{var propertyName=getListenersPropertyName(eventName);if(node[propertyName]){array_remove(node[propertyName],listener);}}}\r
+function getEvent(evt,win){win=win?win:window;return evt?evt:win.event;}\r
+function stopEventPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}\r
+evt.returnValue=false;}\r
+var logLog={quietMode:false,debugMessages:[],setQuietMode:function(quietMode){this.quietMode=bool(quietMode);},numberOfErrors:0,alertAllErrors:false,setAlertAllErrors:function(alertAllErrors){this.alertAllErrors=alertAllErrors;},debug:function(message){this.debugMessages.push(message);},displayDebug:function(){alert(this.debugMessages.join(newLine));},warn:function(message,exception){},error:function(message,exception){if(++this.numberOfErrors==1||this.alertAllErrors){if(!this.quietMode){var alertMessage="log4javascript error: "+message;if(exception){alertMessage+=newLine+newLine+"Original error: "+getExceptionStringRep(exception);}\r
+alert(alertMessage);}}}};log4javascript.logLog=logLog;log4javascript.setEventTypes(["load","error"]);function handleError(message,exception){logLog.error(message,exception);log4javascript.dispatchEvent("error",{"message":message,"exception":exception});}\r
+log4javascript.handleError=handleError;var enabled=!((typeof log4javascript_disabled!="undefined")&&log4javascript_disabled);log4javascript.setEnabled=function(enable){enabled=bool(enable);};log4javascript.isEnabled=function(){return enabled;};var useTimeStampsInMilliseconds=true;log4javascript.setTimeStampsInMilliseconds=function(timeStampsInMilliseconds){useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);};log4javascript.isTimeStampsInMilliseconds=function(){return useTimeStampsInMilliseconds;};log4javascript.evalInScope=function(expr){return eval(expr);};var showStackTraces=false;log4javascript.setShowStackTraces=function(show){showStackTraces=bool(show);};var Level=function(level,name){this.level=level;this.name=name;};Level.prototype={toString:function(){return this.name;},equals:function(level){return this.level==level.level;},isGreaterOrEqual:function(level){return this.level>=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}\r
+Timer.prototype.getElapsedTime=function(){return new Date().getTime()-this.start.getTime();};var anonymousLoggerName="[anonymous]";var defaultLoggerName="[default]";var nullLoggerName="[null]";var rootLoggerName="root";function Logger(name){this.name=name;this.parent=null;this.children=[];var appenders=[];var loggerLevel=null;var isRoot=(this.name===rootLoggerName);var isNull=(this.name===nullLoggerName);var appenderCache=null;var appenderCacheInvalidated=false;this.addChild=function(childLogger){this.children.push(childLogger);childLogger.parent=this;childLogger.invalidateAppenderCache();};var additive=true;this.getAdditivity=function(){return additive;};this.setAdditivity=function(additivity){var valueChanged=(additive!=additivity);additive=additivity;if(valueChanged){this.invalidateAppenderCache();}};this.addAppender=function(appender){if(isNull){handleError("Logger.addAppender: you may not add an appender to the null logger");}else{if(appender instanceof log4javascript.Appender){if(!array_contains(appenders,appender)){appenders.push(appender);appender.setAddedToLogger(this);this.invalidateAppenderCache();}}else{handleError("Logger.addAppender: appender supplied ('"+\r
+toStr(appender)+"') is not a subclass of Appender");}}};this.removeAppender=function(appender){array_remove(appenders,appender);appender.setRemovedFromLogger(this);this.invalidateAppenderCache();};this.removeAllAppenders=function(){var appenderCount=appenders.length;if(appenderCount>0){for(var i=0;i<appenderCount;i++){appenders[i].setRemovedFromLogger(this);}\r
+appenders.length=0;this.invalidateAppenderCache();}};this.getEffectiveAppenders=function(){if(appenderCache===null||appenderCacheInvalidated){var parentEffectiveAppenders=(isRoot||!this.getAdditivity())?[]:this.parent.getEffectiveAppenders();appenderCache=parentEffectiveAppenders.concat(appenders);appenderCacheInvalidated=false;}\r
+return appenderCache;};this.invalidateAppenderCache=function(){appenderCacheInvalidated=true;for(var i=0,len=this.children.length;i<len;i++){this.children[i].invalidateAppenderCache();}};this.log=function(level,params){if(enabled&&level.isGreaterOrEqual(this.getEffectiveLevel())){var exception;var finalParamIndex=params.length-1;var lastParam=params[finalParamIndex];if(params.length>1&&isError(lastParam)){exception=lastParam;finalParamIndex--;}\r
+var messages=[];for(var i=0;i<=finalParamIndex;i++){messages[i]=params[i];}\r
+var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this.callAppenders(loggingEvent);}};this.callAppenders=function(loggingEvent){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].doAppend(loggingEvent);}};this.setLevel=function(level){if(isRoot&&level===null){handleError("Logger.setLevel: you cannot set the level of the root logger to null");}else if(level instanceof Level){loggerLevel=level;}else{handleError("Logger.setLevel: level supplied to logger "+\r
+this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].group(name,initiallyExpanded);}}};this.groupEnd=function(){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i<len;i++){effectiveAppenders[i].groupEnd();}}};var timers={};this.time=function(name,level){if(enabled){if(isUndefined(name)){handleError("Logger.time: a name for the timer must be supplied");}else if(level&&!(level instanceof Level)){handleError("Logger.time: level supplied to timer "+\r
+name+" is not an instance of log4javascript.Level");}else{timers[name]=new Timer(name,level);}}};this.timeEnd=function(name){if(enabled){if(isUndefined(name)){handleError("Logger.timeEnd: a name for the timer must be supplied");}else if(timers[name]){var timer=timers[name];var milliseconds=timer.getElapsedTime();this.log(timer.level,["Timer "+toStr(name)+" completed in "+milliseconds+"ms"]);delete timers[name];}else{logLog.warn("Logger.timeEnd: no timer found with name "+name);}}};this.assert=function(expr){if(enabled&&!expr){var args=[];for(var i=1,len=arguments.length;i<len;i++){args.push(arguments[i]);}\r
+args=(args.length>0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}\r
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+\r
+toStr(loggerName)+" supplied, returning anonymous logger");}\r
+if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}\r
+if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}\r
+parentLogger.addChild(logger);}\r
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}\r
+return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}\r
+return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}\r
+if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}\r
+if(this.hasCustomFields()){for(var i=0,len=this.customFields.length;i<len;i++){var val=this.customFields[i].value;if(typeof val==="function"){val=val(this,loggingEvent);}\r
+dataValues.push([this.customFields[i].name,val]);}}\r
+return dataValues;},setKeys:function(loggerKey,timeStampKey,levelKey,messageKey,exceptionKey,urlKey,millisecondsKey){this.loggerKey=extractStringFromParam(loggerKey,this.defaults.loggerKey);this.timeStampKey=extractStringFromParam(timeStampKey,this.defaults.timeStampKey);this.levelKey=extractStringFromParam(levelKey,this.defaults.levelKey);this.messageKey=extractStringFromParam(messageKey,this.defaults.messageKey);this.exceptionKey=extractStringFromParam(exceptionKey,this.defaults.exceptionKey);this.urlKey=extractStringFromParam(urlKey,this.defaults.urlKey);this.millisecondsKey=extractStringFromParam(millisecondsKey,this.defaults.millisecondsKey);},setCustomField:function(name,value){var fieldUpdated=false;for(var i=0,len=this.customFields.length;i<len;i++){if(this.customFields[i].name===name){this.customFields[i].value=value;fieldUpdated=true;}}\r
+if(!fieldUpdated){this.customFields.push({"name":name,"value":value});}},hasCustomFields:function(){return(this.customFields.length>0);},toString:function(){handleError("Layout.toString: all layouts must override this method");}};log4javascript.Layout=Layout;var Appender=function(){};Appender.prototype=new EventSupport();Appender.prototype.layout=new PatternLayout();Appender.prototype.threshold=Level.ALL;Appender.prototype.loggers=[];Appender.prototype.doAppend=function(loggingEvent){if(enabled&&loggingEvent.level.level>=this.threshold.level){this.append(loggingEvent);}};Appender.prototype.append=function(loggingEvent){};Appender.prototype.setLayout=function(layout){if(layout instanceof Layout){this.layout=layout;}else{handleError("Appender.setLayout: layout supplied to "+\r
+this.toString()+" is not a subclass of Layout");}};Appender.prototype.getLayout=function(){return this.layout;};Appender.prototype.setThreshold=function(threshold){if(threshold instanceof Level){this.threshold=threshold;}else{handleError("Appender.setThreshold: threshold supplied to "+\r
+this.toString()+" is not a subclass of Level");}};Appender.prototype.getThreshold=function(){return this.threshold;};Appender.prototype.setAddedToLogger=function(logger){this.loggers.push(logger);};Appender.prototype.setRemovedFromLogger=function(logger){array_remove(this.loggers,logger);};Appender.prototype.group=emptyFunction;Appender.prototype.groupEnd=emptyFunction;Appender.prototype.toString=function(){handleError("Appender.toString: all appenders must override this method");};log4javascript.Appender=Appender;function SimpleLayout(){this.customFields=[];}\r
+SimpleLayout.prototype=new Layout();SimpleLayout.prototype.format=function(loggingEvent){return loggingEvent.level.name+" - "+loggingEvent.getCombinedMessages();};SimpleLayout.prototype.ignoresThrowable=function(){return true;};SimpleLayout.prototype.toString=function(){return"SimpleLayout";};log4javascript.SimpleLayout=SimpleLayout;function NullLayout(){this.customFields=[];}\r
+NullLayout.prototype=new Layout();NullLayout.prototype.format=function(loggingEvent){return loggingEvent.messages;};NullLayout.prototype.ignoresThrowable=function(){return true;};NullLayout.prototype.toString=function(){return"NullLayout";};log4javascript.NullLayout=NullLayout;function XmlLayout(combineMessages){this.combineMessages=extractBooleanFromParam(combineMessages,true);this.customFields=[];}\r
+XmlLayout.prototype=new Layout();XmlLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};XmlLayout.prototype.getContentType=function(){return"text/xml";};XmlLayout.prototype.escapeCdata=function(str){return str.replace(/\]\]>/,"]]>]]&gt;<![CDATA[");};XmlLayout.prototype.format=function(loggingEvent){var layout=this;var i,len;function formatMessage(message){message=(typeof message==="string")?message:toStr(message);return"<log4javascript:message><![CDATA["+\r
+layout.escapeCdata(message)+"]]></log4javascript:message>";}\r
+var str="<log4javascript:event logger=\""+loggingEvent.logger.name+"\" timestamp=\""+this.getTimeStampValue(loggingEvent)+"\"";if(!this.isTimeStampsInMilliseconds()){str+=" milliseconds=\""+loggingEvent.milliseconds+"\"";}\r
+str+=" level=\""+loggingEvent.level.name+"\">"+newLine;if(this.combineMessages){str+=formatMessage(loggingEvent.getCombinedMessages());}else{str+="<log4javascript:messages>"+newLine;for(i=0,len=loggingEvent.messages.length;i<len;i++){str+=formatMessage(loggingEvent.messages[i])+newLine;}\r
+str+="</log4javascript:messages>"+newLine;}\r
+if(this.hasCustomFields()){for(i=0,len=this.customFields.length;i<len;i++){str+="<log4javascript:customfield name=\""+\r
+this.customFields[i].name+"\"><![CDATA["+\r
+this.customFields[i].value.toString()+"]]></log4javascript:customfield>"+newLine;}}\r
+if(loggingEvent.exception){str+="<log4javascript:exception><![CDATA["+\r
+getExceptionStringRep(loggingEvent.exception)+"]]></log4javascript:exception>"+newLine;}\r
+str+="</log4javascript:event>"+newLine+newLine;return str;};XmlLayout.prototype.ignoresThrowable=function(){return false;};XmlLayout.prototype.toString=function(){return"XmlLayout";};log4javascript.XmlLayout=XmlLayout;function escapeNewLines(str){return str.replace(/\r\n|\r|\n/g,"\\r\\n");}\r
+function JsonLayout(readable,combineMessages){this.readable=extractBooleanFromParam(readable,false);this.combineMessages=extractBooleanFromParam(combineMessages,true);this.batchHeader=this.readable?"["+newLine:"[";this.batchFooter=this.readable?"]"+newLine:"]";this.batchSeparator=this.readable?","+newLine:",";this.setKeys();this.colon=this.readable?": ":":";this.tab=this.readable?"\t":"";this.lineBreak=this.readable?newLine:"";this.customFields=[];}\r
+JsonLayout.prototype=new Layout();JsonLayout.prototype.isReadable=function(){return this.readable;};JsonLayout.prototype.isCombinedMessages=function(){return this.combineMessages;};JsonLayout.prototype.format=function(loggingEvent){var layout=this;var dataValues=this.getDataValues(loggingEvent,this.combineMessages);var str="{"+this.lineBreak;var i,len;function formatValue(val,prefix,expand){var formattedValue;var valType=typeof val;if(val instanceof Date){formattedValue=String(val.getTime());}else if(expand&&(val instanceof Array)){formattedValue="["+layout.lineBreak;for(var i=0,len=val.length;i<len;i++){var childPrefix=prefix+layout.tab;formattedValue+=childPrefix+formatValue(val[i],childPrefix,false);if(i<val.length-1){formattedValue+=",";}\r
+formattedValue+=layout.lineBreak;}\r
+formattedValue+=prefix+"]";}else if(valType!=="number"&&valType!=="boolean"){formattedValue="\""+escapeNewLines(toStr(val).replace(/\"/g,"\\\""))+"\"";}else{formattedValue=val;}\r
+return formattedValue;}\r
+for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+"\""+this.colon+formatValue(dataValues[i][1],this.tab,true);if(i<len){str+=",";}\r
+str+=this.lineBreak;}\r
+str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}\r
+HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i<len;i++){var val=(dataValues[i][1]instanceof Date)?String(dataValues[i][1].getTime()):dataValues[i][1];queryBits.push(urlEncode(dataValues[i][0])+"="+urlEncode(val));}\r
+return queryBits.join("&");};HttpPostDataLayout.prototype.ignoresThrowable=function(loggingEvent){return false;};HttpPostDataLayout.prototype.toString=function(){return"HttpPostDataLayout";};log4javascript.HttpPostDataLayout=HttpPostDataLayout;function formatObjectExpansion(obj,depth,indentation){var objectsExpanded=[];function doFormat(obj,depth,indentation){var i,j,len,childDepth,childIndentation,childLines,expansion,childExpansion;if(!indentation){indentation="";}\r
+function formatString(text){var lines=splitIntoLines(text);for(var j=1,jLen=lines.length;j<jLen;j++){lines[j]=indentation+lines[j];}\r
+return lines.join(newLine);}\r
+if(obj===null){return"null";}else if(typeof obj=="undefined"){return"undefined";}else if(typeof obj=="string"){return formatString(obj);}else if(typeof obj=="object"&&array_contains(objectsExpanded,obj)){try{expansion=toStr(obj);}catch(ex){expansion="Error formatting property. Details: "+getExceptionStringRep(ex);}\r
+return expansion+" [already expanded]";}else if((obj instanceof Array)&&depth>0){objectsExpanded.push(obj);expansion="["+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i=0,len=obj.length;i<len;i++){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+childExpansion);}catch(ex){childLines.push(childIndentation+"Error formatting array member. Details: "+\r
+getExceptionStringRep(ex)+"");}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"]";return expansion;}else if(Object.prototype.toString.call(obj)=="[object Date]"){return obj.toString();}else if(typeof obj=="object"&&depth>0){objectsExpanded.push(obj);expansion="{"+newLine;childDepth=depth-1;childIndentation=indentation+"  ";childLines=[];for(i in obj){try{childExpansion=doFormat(obj[i],childDepth,childIndentation);childLines.push(childIndentation+i+": "+childExpansion);}catch(ex){childLines.push(childIndentation+i+": Error formatting property. Details: "+\r
+getExceptionStringRep(ex));}}\r
+expansion+=childLines.join(","+newLine)+newLine+indentation+"}";return expansion;}else{return formatString(toStr(obj));}}\r
+return doFormat(obj,depth,indentation);}\r
+var SimpleDateFormat;(function(){var regex=/('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;var monthNames=["January","February","March","April","May","June","July","August","September","October","November","December"];var dayNames=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var TEXT2=0,TEXT3=1,NUMBER=2,YEAR=3,MONTH=4,TIMEZONE=5;var types={G:TEXT2,y:YEAR,M:MONTH,w:NUMBER,W:NUMBER,D:NUMBER,d:NUMBER,F:NUMBER,E:TEXT3,a:TEXT2,H:NUMBER,k:NUMBER,K:NUMBER,h:NUMBER,m:NUMBER,s:NUMBER,S:NUMBER,Z:TIMEZONE};var ONE_DAY=24*60*60*1000;var ONE_WEEK=7*ONE_DAY;var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK=1;var newDateAtMidnight=function(year,month,day){var d=new Date(year,month,day,0,0,0);d.setMilliseconds(0);return d;};Date.prototype.getDifference=function(date){return this.getTime()-date.getTime();};Date.prototype.isBefore=function(d){return this.getTime()<d.getTime();};Date.prototype.getUTCTime=function(){return Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());};Date.prototype.getTimeSince=function(d){return this.getUTCTime()-d.getUTCTime();};Date.prototype.getPreviousSunday=function(){var midday=new Date(this.getFullYear(),this.getMonth(),this.getDate(),12,0,0);var previousSunday=new Date(midday.getTime()-this.getDay()*ONE_DAY);return newDateAtMidnight(previousSunday.getFullYear(),previousSunday.getMonth(),previousSunday.getDate());};Date.prototype.getWeekInYear=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);var numberOfSundays=previousSunday.isBefore(startOfYear)?0:1+Math.floor(previousSunday.getTimeSince(startOfYear)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfYear.getDay();var weekInYear=numberOfSundays;if(numberOfDaysInFirstWeek<minimalDaysInFirstWeek){weekInYear--;}\r
+return weekInYear;};Date.prototype.getWeekInMonth=function(minimalDaysInFirstWeek){if(isUndefined(this.minimalDaysInFirstWeek)){minimalDaysInFirstWeek=DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;}\r
+var previousSunday=this.getPreviousSunday();var startOfMonth=newDateAtMidnight(this.getFullYear(),this.getMonth(),1);var numberOfSundays=previousSunday.isBefore(startOfMonth)?0:1+Math.floor(previousSunday.getTimeSince(startOfMonth)/ONE_WEEK);var numberOfDaysInFirstWeek=7-startOfMonth.getDay();var weekInMonth=numberOfSundays;if(numberOfDaysInFirstWeek>=minimalDaysInFirstWeek){weekInMonth++;}\r
+return weekInMonth;};Date.prototype.getDayInYear=function(){var startOfYear=newDateAtMidnight(this.getFullYear(),0,1);return 1+Math.floor(this.getTimeSince(startOfYear)/ONE_DAY);};SimpleDateFormat=function(formatString){this.formatString=formatString;};SimpleDateFormat.prototype.setMinimalDaysInFirstWeek=function(days){this.minimalDaysInFirstWeek=days;};SimpleDateFormat.prototype.getMinimalDaysInFirstWeek=function(){return isUndefined(this.minimalDaysInFirstWeek)?DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK:this.minimalDaysInFirstWeek;};var padWithZeroes=function(str,len){while(str.length<len){str="0"+str;}\r
+return str;};var formatText=function(data,numberOfLetters,minLength){return(numberOfLetters>=4)?data:data.substr(0,Math.max(minLength,numberOfLetters));};var formatNumber=function(data,numberOfLetters){var dataString=""+data;return padWithZeroes(dataString,numberOfLetters);};SimpleDateFormat.prototype.format=function(date){var formattedString="";var result;var searchString=this.formatString;while((result=regex.exec(searchString))){var quotedString=result[1];var patternLetters=result[2];var otherLetters=result[3];var otherCharacters=result[4];if(quotedString){if(quotedString=="''"){formattedString+="'";}else{formattedString+=quotedString.substring(1,quotedString.length-1);}}else if(otherLetters){}else if(otherCharacters){formattedString+=otherCharacters;}else if(patternLetters){var patternLetter=patternLetters.charAt(0);var numberOfLetters=patternLetters.length;var rawData="";switch(patternLetter){case"G":rawData="AD";break;case"y":rawData=date.getFullYear();break;case"M":rawData=date.getMonth();break;case"w":rawData=date.getWeekInYear(this.getMinimalDaysInFirstWeek());break;case"W":rawData=date.getWeekInMonth(this.getMinimalDaysInFirstWeek());break;case"D":rawData=date.getDayInYear();break;case"d":rawData=date.getDate();break;case"F":rawData=1+Math.floor((date.getDate()-1)/7);break;case"E":rawData=dayNames[date.getDay()];break;case"a":rawData=(date.getHours()>=12)?"PM":"AM";break;case"H":rawData=date.getHours();break;case"k":rawData=date.getHours()||24;break;case"K":rawData=date.getHours()%12;break;case"h":rawData=(date.getHours()%12)||12;break;case"m":rawData=date.getMinutes();break;case"s":rawData=date.getSeconds();break;case"S":rawData=date.getMilliseconds();break;case"Z":rawData=date.getTimezoneOffset();break;}\r
+switch(types[patternLetter]){case TEXT2:formattedString+=formatText(rawData,numberOfLetters,2);break;case TEXT3:formattedString+=formatText(rawData,numberOfLetters,3);break;case NUMBER:formattedString+=formatNumber(rawData,numberOfLetters);break;case YEAR:if(numberOfLetters<=3){var dataString=""+rawData;formattedString+=dataString.substr(2,2);}else{formattedString+=formatNumber(rawData,numberOfLetters);}\r
+break;case MONTH:if(numberOfLetters>=3){formattedString+=formatText(monthNames[rawData],numberOfLetters,numberOfLetters);}else{formattedString+=formatNumber(rawData+1,numberOfLetters);}\r
+break;case TIMEZONE:var isPositive=(rawData>0);var prefix=isPositive?"-":"+";var absData=Math.abs(rawData);var hours=""+Math.floor(absData/60);hours=padWithZeroes(hours,2);var minutes=""+(absData%60);minutes=padWithZeroes(minutes,2);formattedString+=prefix+hours+minutes;break;}}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};})();log4javascript.SimpleDateFormat=SimpleDateFormat;function PatternLayout(pattern){if(pattern){this.pattern=pattern;}else{this.pattern=PatternLayout.DEFAULT_CONVERSION_PATTERN;}\r
+this.customFields=[];}\r
+PatternLayout.TTCC_CONVERSION_PATTERN="%r %p %c - %m%n";PatternLayout.DEFAULT_CONVERSION_PATTERN="%m%n";PatternLayout.ISO8601_DATEFORMAT="yyyy-MM-dd HH:mm:ss,SSS";PatternLayout.DATETIME_DATEFORMAT="dd MMM yyyy HH:mm:ss,SSS";PatternLayout.ABSOLUTETIME_DATEFORMAT="HH:mm:ss,SSS";PatternLayout.prototype=new Layout();PatternLayout.prototype.format=function(loggingEvent){var regex=/%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;var formattedString="";var result;var searchString=this.pattern;while((result=regex.exec(searchString))){var matchedString=result[0];var padding=result[1];var truncation=result[2];var conversionCharacter=result[3];var specifier=result[5];var text=result[6];if(text){formattedString+=""+text;}else{var replacement="";switch(conversionCharacter){case"a":case"m":var depth=0;if(specifier){depth=parseInt(specifier,10);if(isNaN(depth)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character '"+conversionCharacter+"' - should be a number");depth=0;}}\r
+var messages=(conversionCharacter==="a")?loggingEvent.messages[0]:loggingEvent.messages;for(var i=0,len=messages.length;i<len;i++){if(i>0&&(replacement.charAt(replacement.length-1)!==" ")){replacement+=" ";}\r
+if(depth===0){replacement+=messages[i];}else{replacement+=formatObjectExpansion(messages[i],depth);}}\r
+break;case"c":var loggerName=loggingEvent.logger.name;if(specifier){var precision=parseInt(specifier,10);var loggerNameBits=loggingEvent.logger.name.split(".");if(precision>=loggerNameBits.length){replacement=loggerName;}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".");}}else{replacement=loggerName;}\r
+break;case"d":var dateFormat=PatternLayout.ISO8601_DATEFORMAT;if(specifier){dateFormat=specifier;if(dateFormat=="ISO8601"){dateFormat=PatternLayout.ISO8601_DATEFORMAT;}else if(dateFormat=="ABSOLUTE"){dateFormat=PatternLayout.ABSOLUTETIME_DATEFORMAT;}else if(dateFormat=="DATE"){dateFormat=PatternLayout.DATETIME_DATEFORMAT;}}\r
+replacement=(new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);break;case"f":if(this.hasCustomFields()){var fieldIndex=0;if(specifier){fieldIndex=parseInt(specifier,10);if(isNaN(fieldIndex)){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - should be a number");}else if(fieldIndex===0){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - must be greater than zero");}else if(fieldIndex>this.customFields.length){handleError("PatternLayout.format: invalid specifier '"+\r
+specifier+"' for conversion character 'f' - there aren't that many custom fields");}else{fieldIndex=fieldIndex-1;}}\r
+var val=this.customFields[fieldIndex].value;if(typeof val=="function"){val=val(this,loggingEvent);}\r
+replacement=val;}\r
+break;case"n":replacement=newLine;break;case"p":replacement=loggingEvent.level.name;break;case"r":replacement=""+loggingEvent.timeStamp.getDifference(applicationStartDate);break;case"%":replacement="%";break;default:replacement=matchedString;break;}\r
+var l;if(truncation){l=parseInt(truncation.substr(1),10);var strLen=replacement.length;if(l<strLen){replacement=replacement.substring(strLen-l,strLen);}}\r
+if(padding){if(padding.charAt(0)=="-"){l=parseInt(padding.substr(1),10);while(replacement.length<l){replacement+=" ";}}else{l=parseInt(padding,10);while(replacement.length<l){replacement=" "+replacement;}}}\r
+formattedString+=replacement;}\r
+searchString=searchString.substr(result.index+result[0].length);}\r
+return formattedString;};PatternLayout.prototype.ignoresThrowable=function(){return true;};PatternLayout.prototype.toString=function(){return"PatternLayout";};log4javascript.PatternLayout=PatternLayout;function AlertAppender(){}\r
+AlertAppender.prototype=new Appender();AlertAppender.prototype.layout=new SimpleLayout();AlertAppender.prototype.append=function(loggingEvent){var formattedMessage=this.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+alert(formattedMessage);};AlertAppender.prototype.toString=function(){return"AlertAppender";};log4javascript.AlertAppender=AlertAppender;function BrowserConsoleAppender(){}\r
+BrowserConsoleAppender.prototype=new log4javascript.Appender();BrowserConsoleAppender.prototype.layout=new NullLayout();BrowserConsoleAppender.prototype.threshold=Level.DEBUG;BrowserConsoleAppender.prototype.append=function(loggingEvent){var appender=this;var getFormattedMessage=function(){var layout=appender.getLayout();var formattedMessage=layout.format(loggingEvent);if(layout.ignoresThrowable()&&loggingEvent.exception){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+return formattedMessage;};if((typeof opera!="undefined")&&opera.postError){opera.postError(getFormattedMessage());}else if(window.console&&window.console.log){var formattedMesage=getFormattedMessage();if(window.console.debug&&Level.DEBUG.isGreaterOrEqual(loggingEvent.level)){window.console.debug(formattedMesage);}else if(window.console.info&&Level.INFO.equals(loggingEvent.level)){window.console.info(formattedMesage);}else if(window.console.warn&&Level.WARN.equals(loggingEvent.level)){window.console.warn(formattedMesage);}else if(window.console.error&&loggingEvent.level.isGreaterOrEqual(Level.ERROR)){window.console.error(formattedMesage);}else{window.console.log(formattedMesage);}}};BrowserConsoleAppender.prototype.group=function(name){if(window.console&&window.console.group){window.console.group(name);}};BrowserConsoleAppender.prototype.groupEnd=function(){if(window.console&&window.console.groupEnd){window.console.groupEnd();}};BrowserConsoleAppender.prototype.toString=function(){return"BrowserConsoleAppender";};log4javascript.BrowserConsoleAppender=BrowserConsoleAppender;var xmlHttpFactories=[function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];var getXmlHttp=function(errorHandler){var xmlHttp=null,factory;for(var i=0,len=xmlHttpFactories.length;i<len;i++){factory=xmlHttpFactories[i];try{xmlHttp=factory();getXmlHttp=factory;return xmlHttp;}catch(e){}}\r
+if(errorHandler){errorHandler();}else{handleError("getXmlHttp: unable to obtain XMLHttpRequest object");}};function isHttpRequestSuccessful(xmlHttp){return isUndefined(xmlHttp.status)||xmlHttp.status===0||(xmlHttp.status>=200&&xmlHttp.status<300)||xmlHttp.status==1223;}\r
+function AjaxAppender(url){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;}\r
+var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var contentType=this.defaults.contentType;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var headers=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+\r
+configOptionName+"' may not be set after the appender has been initialized");return false;}\r
+return true;}\r
+this.getSessionId=function(){return sessionId;};this.setSessionId=function(sessionIdParam){sessionId=extractStringFromParam(sessionIdParam,null);this.layout.setCustomField("sessionid",sessionId);};this.setLayout=function(layoutParam){if(checkCanConfigure("layout")){this.layout=layoutParam;if(sessionId!==null){this.setSessionId(sessionId);}}};this.isTimed=function(){return timed;};this.setTimed=function(timedParam){if(checkCanConfigure("timed")){timed=bool(timedParam);}};this.getTimerInterval=function(){return timerInterval;};this.setTimerInterval=function(timerIntervalParam){if(checkCanConfigure("timerInterval")){timerInterval=extractIntFromParam(timerIntervalParam,timerInterval);}};this.isWaitForResponse=function(){return waitForResponse;};this.setWaitForResponse=function(waitForResponseParam){if(checkCanConfigure("waitForResponse")){waitForResponse=bool(waitForResponseParam);}};this.getBatchSize=function(){return batchSize;};this.setBatchSize=function(batchSizeParam){if(checkCanConfigure("batchSize")){batchSize=extractIntFromParam(batchSizeParam,batchSize);}};this.isSendAllOnUnload=function(){return sendAllOnUnload;};this.setSendAllOnUnload=function(sendAllOnUnloadParam){if(checkCanConfigure("sendAllOnUnload")){sendAllOnUnload=extractBooleanFromParam(sendAllOnUnloadParam,sendAllOnUnload);}};this.setRequestSuccessCallback=function(requestSuccessCallbackParam){requestSuccessCallback=extractFunctionFromParam(requestSuccessCallbackParam,requestSuccessCallback);};this.setFailCallback=function(failCallbackParam){failCallback=extractFunctionFromParam(failCallbackParam,failCallback);};this.getPostVarName=function(){return postVarName;};this.setPostVarName=function(postVarNameParam){if(checkCanConfigure("postVarName")){postVarName=extractStringFromParam(postVarNameParam,postVarName);}};this.getHeaders=function(){return headers;};this.addHeader=function(name,value){if(name.toLowerCase()=="content-type"){contentType=value;}else{headers.push({name:name,value:value});}};function sendAll(){if(isSupported&&enabled){sending=true;var currentRequestBatch;if(waitForResponse){if(queuedRequests.length>0){currentRequestBatch=queuedRequests.shift();sendRequest(preparePostData(currentRequestBatch),sendAll);}else{sending=false;if(timed){scheduleSending();}}}else{while((currentRequestBatch=queuedRequests.shift())){sendRequest(preparePostData(currentRequestBatch));}\r
+sending=false;if(timed){scheduleSending();}}}}\r
+this.sendAll=sendAll;function sendAllRemaining(){var sendingAnything=false;if(isSupported&&enabled){var actualBatchSize=appender.getLayout().allowBatching()?batchSize:1;var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);if(queuedLoggingEvents.length>=actualBatchSize){queuedRequests.push(batchedLoggingEvents);batchedLoggingEvents=[];}}\r
+if(batchedLoggingEvents.length>0){queuedRequests.push(batchedLoggingEvents);}\r
+sendingAnything=(queuedRequests.length>0);waitForResponse=false;timed=false;sendAll();}\r
+return sendingAnything;}\r
+this.sendAllRemaining=sendAllRemaining;function preparePostData(batchedLoggingEvents){var formattedMessages=[];var currentLoggingEvent;var postData="";while((currentLoggingEvent=batchedLoggingEvents.shift())){var currentFormattedMessage=appender.getLayout().format(currentLoggingEvent);if(appender.getLayout().ignoresThrowable()){currentFormattedMessage+=currentLoggingEvent.getThrowableStrRep();}\r
+formattedMessages.push(currentFormattedMessage);}\r
+if(batchedLoggingEvents.length==1){postData=formattedMessages.join("");}else{postData=appender.getLayout().batchHeader+\r
+formattedMessages.join(appender.getLayout().batchSeparator)+\r
+appender.getLayout().batchFooter;}\r
+if(contentType==appender.defaults.contentType){postData=appender.getLayout().returnsPostData?postData:urlEncode(postVarName)+"="+urlEncode(postData);if(postData.length>0){postData+="&";}\r
+postData+="layout="+urlEncode(appender.getLayout().toString());}\r
+return postData;}\r
+function scheduleSending(){window.setTimeout(sendAll,timerInterval);}\r
+function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}}\r
+function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(xmlHttp.overrideMimeType){xmlHttp.overrideMimeType(appender.getLayout().getContentType());}\r
+xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}\r
+if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+\r
+url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}}\r
+xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}\r
+xmlHttp.setRequestHeader("Content-Type",contentType);}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}\r
+return;}\r
+xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}}\r
+this.append=function(loggingEvent){if(isSupported){if(!initialized){init();}\r
+queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}\r
+queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}\r
+if(sendAllRemaining()){return"Sending log messages";}};}\r
+if(timed){scheduleSending();}}}\r
+AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function setCookie(name,value,days,path){var expires;path=path?"; path="+path:"";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";}\r
+document.cookie=escape(name)+"="+escape(value)+expires+path;}\r
+function getCookie(name){var nameEquals=escape(name)+"=";var ca=document.cookie.split(";");for(var i=0,len=ca.length;i<len;i++){var c=ca[i];while(c.charAt(0)===" "){c=c.substring(1,c.length);}\r
+if(c.indexOf(nameEquals)===0){return unescape(c.substring(nameEquals.length,c.length));}}\r
+return null;}\r
+function getBaseUrl(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i<len;++i){if(scripts[i].src.indexOf("log4javascript")!=-1){var lastSlash=scripts[i].src.lastIndexOf("/");return(lastSlash==-1)?"":scripts[i].src.substr(0,lastSlash+1);}}\r
+return null;}\r
+function isLoaded(win){try{return bool(win.loaded);}catch(ex){return false;}}\r
+var ConsoleAppender;(function(){var getConsoleHtmlLines=function(){return['<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">','<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">','<head>','<title>log4javascript</title>','<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />','<!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->','<meta http-equiv="X-UA-Compatible" content="IE=7" />','<script type="text/javascript">var isIe = false, isIePre7 = false;</script>','<!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->','<!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->','<script type="text/javascript">','//<![CDATA[','var loggingEnabled=true;var logQueuedEventsTimer=null;var logEntries=[];var logEntriesAndSeparators=[];var logItems=[];var renderDelay=100;var unrenderedLogItemsExist=false;var rootGroup,currentGroup=null;var loaded=false;var currentLogItem=null;var logMainContainer;function copyProperties(obj,props){for(var i in props){obj[i]=props[i];}}','function LogItem(){}','LogItem.prototype={mainContainer:null,wrappedContainer:null,unwrappedContainer:null,group:null,appendToLog:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].appendToLog();}','this.group.update();},doRemove:function(doUpdate,removeFromGroup){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].remove();}','this.unwrappedElementContainer=null;this.wrappedElementContainer=null;this.mainElementContainer=null;}','if(this.group&&removeFromGroup){this.group.removeChild(this,doUpdate);}','if(this===currentLogItem){currentLogItem=null;}},remove:function(doUpdate,removeFromGroup){this.doRemove(doUpdate,removeFromGroup);},render:function(){},accept:function(visitor){visitor.visit(this);},getUnwrappedDomContainer:function(){return this.group.unwrappedElementContainer.contentDiv;},getWrappedDomContainer:function(){return this.group.wrappedElementContainer.contentDiv;},getMainDomContainer:function(){return this.group.mainElementContainer.contentDiv;}};LogItem.serializedItemKeys={LOG_ENTRY:0,GROUP_START:1,GROUP_END:2};function LogItemContainerElement(){}','LogItemContainerElement.prototype={appendToLog:function(){var insertBeforeFirst=(newestAtTop&&this.containerDomNode.hasChildNodes());if(insertBeforeFirst){this.containerDomNode.insertBefore(this.mainDiv,this.containerDomNode.firstChild);}else{this.containerDomNode.appendChild(this.mainDiv);}}};function SeparatorElementContainer(containerDomNode){this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="separator";this.mainDiv.innerHTML="&nbsp;";}','SeparatorElementContainer.prototype=new LogItemContainerElement();SeparatorElementContainer.prototype.remove=function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;};function Separator(){this.rendered=false;}','Separator.prototype=new LogItem();copyProperties(Separator.prototype,{render:function(){var containerDomNode=this.group.contentDiv;if(isIe){this.unwrappedElementContainer=new SeparatorElementContainer(this.getUnwrappedDomContainer());this.wrappedElementContainer=new SeparatorElementContainer(this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new SeparatorElementContainer(this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}','this.content=this.formattedMessage;this.rendered=true;}});function GroupElementContainer(group,containerDomNode,isRoot,isWrapped){this.group=group;this.containerDomNode=containerDomNode;this.isRoot=isRoot;this.isWrapped=isWrapped;this.expandable=false;if(this.isRoot){if(isIe){this.contentDiv=logMainContainer.appendChild(document.createElement("div"));this.contentDiv.id=this.isWrapped?"log_wrapped":"log_unwrapped";}else{this.contentDiv=logMainContainer;}}else{var groupElementContainer=this;this.mainDiv=document.createElement("div");this.mainDiv.className="group";this.headingDiv=this.mainDiv.appendChild(document.createElement("div"));this.headingDiv.className="groupheading";this.expander=this.headingDiv.appendChild(document.createElement("span"));this.expander.className="expander unselectable greyedout";this.expander.unselectable=true;var expanderText=this.group.expanded?"-":"+";this.expanderTextNode=this.expander.appendChild(document.createTextNode(expanderText));this.headingDiv.appendChild(document.createTextNode(" "+this.group.name));this.contentDiv=this.mainDiv.appendChild(document.createElement("div"));var contentCssClass=this.group.expanded?"expanded":"collapsed";this.contentDiv.className="groupcontent "+contentCssClass;this.expander.onclick=function(){if(groupElementContainer.group.expandable){groupElementContainer.group.toggleExpanded();}};}}','GroupElementContainer.prototype=new LogItemContainerElement();copyProperties(GroupElementContainer.prototype,{toggleExpanded:function(){if(!this.isRoot){var oldCssClass,newCssClass,expanderText;if(this.group.expanded){newCssClass="expanded";oldCssClass="collapsed";expanderText="-";}else{newCssClass="collapsed";oldCssClass="expanded";expanderText="+";}','replaceClass(this.contentDiv,newCssClass,oldCssClass);this.expanderTextNode.nodeValue=expanderText;}},remove:function(){if(!this.isRoot){this.headingDiv=null;this.expander.onclick=null;this.expander=null;this.expanderTextNode=null;this.contentDiv=null;this.containerDomNode=null;this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;}},reverseChildren:function(){var node=null;var childDomNodes=[];while((node=this.contentDiv.firstChild)){this.contentDiv.removeChild(node);childDomNodes.push(node);}','while((node=childDomNodes.pop())){this.contentDiv.appendChild(node);}},update:function(){if(!this.isRoot){if(this.group.expandable){removeClass(this.expander,"greyedout");}else{addClass(this.expander,"greyedout");}}},clear:function(){if(this.isRoot){this.contentDiv.innerHTML="";}}});function Group(name,isRoot,initiallyExpanded){this.name=name;this.group=null;this.isRoot=isRoot;this.initiallyExpanded=initiallyExpanded;this.elementContainers=[];this.children=[];this.expanded=initiallyExpanded;this.rendered=false;this.expandable=false;}','Group.prototype=new LogItem();copyProperties(Group.prototype,{addChild:function(logItem){this.children.push(logItem);logItem.group=this;},render:function(){if(isIe){var unwrappedDomContainer,wrappedDomContainer;if(this.isRoot){unwrappedDomContainer=logMainContainer;wrappedDomContainer=logMainContainer;}else{unwrappedDomContainer=this.getUnwrappedDomContainer();wrappedDomContainer=this.getWrappedDomContainer();}','this.unwrappedElementContainer=new GroupElementContainer(this,unwrappedDomContainer,this.isRoot,false);this.wrappedElementContainer=new GroupElementContainer(this,wrappedDomContainer,this.isRoot,true);this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{var mainDomContainer=this.isRoot?logMainContainer:this.getMainDomContainer();this.mainElementContainer=new GroupElementContainer(this,mainDomContainer,this.isRoot,false);this.elementContainers=[this.mainElementContainer];}','this.rendered=true;},toggleExpanded:function(){this.expanded=!this.expanded;for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].toggleExpanded();}},expand:function(){if(!this.expanded){this.toggleExpanded();}},accept:function(visitor){visitor.visitGroup(this);},reverseChildren:function(){if(this.rendered){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].reverseChildren();}}},update:function(){var previouslyExpandable=this.expandable;this.expandable=(this.children.length!==0);if(this.expandable!==previouslyExpandable){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].update();}}},flatten:function(){var visitor=new GroupFlattener();this.accept(visitor);return visitor.logEntriesAndSeparators;},removeChild:function(child,doUpdate){array_remove(this.children,child);child.group=null;if(doUpdate){this.update();}},remove:function(doUpdate,removeFromGroup){for(var i=0,len=this.children.length;i<len;i++){this.children[i].remove(false,false);}','this.children=[];this.update();if(this===currentGroup){currentGroup=this.group;}','this.doRemove(doUpdate,removeFromGroup);},serialize:function(items){items.push([LogItem.serializedItemKeys.GROUP_START,this.name]);for(var i=0,len=this.children.length;i<len;i++){this.children[i].serialize(items);}','if(this!==currentGroup){items.push([LogItem.serializedItemKeys.GROUP_END]);}},clear:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clear();}}});function LogEntryElementContainer(){}','LogEntryElementContainer.prototype=new LogItemContainerElement();copyProperties(LogEntryElementContainer.prototype,{remove:function(){this.doRemove();},doRemove:function(){this.mainDiv.parentNode.removeChild(this.mainDiv);this.mainDiv=null;this.contentElement=null;this.containerDomNode=null;},setContent:function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=content;}},setSearchMatch:function(isMatch){var oldCssClass=isMatch?"searchnonmatch":"searchmatch";var newCssClass=isMatch?"searchmatch":"searchnonmatch";replaceClass(this.mainDiv,newCssClass,oldCssClass);},clearSearch:function(){removeClass(this.mainDiv,"searchmatch");removeClass(this.mainDiv,"searchnonmatch");}});function LogEntryWrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.mainDiv.className="logentry wrapped "+this.logEntry.level;this.contentElement=this.mainDiv;}','LogEntryWrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryWrappedElementContainer.prototype.setContent=function(content,wrappedContent){if(content===this.formattedMessage){this.contentElement.innerHTML="";this.contentElement.appendChild(document.createTextNode(this.formattedMessage));}else{this.contentElement.innerHTML=wrappedContent;}};function LogEntryUnwrappedElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry unwrapped "+this.logEntry.level;this.pre=this.mainDiv.appendChild(document.createElement("pre"));this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));this.pre.className="unwrapped";this.contentElement=this.pre;}','LogEntryUnwrappedElementContainer.prototype=new LogEntryElementContainer();LogEntryUnwrappedElementContainer.prototype.remove=function(){this.doRemove();this.pre=null;};function LogEntryMainElementContainer(logEntry,containerDomNode){this.logEntry=logEntry;this.containerDomNode=containerDomNode;this.mainDiv=document.createElement("div");this.mainDiv.className="logentry nonielogentry "+this.logEntry.level;this.contentElement=this.mainDiv.appendChild(document.createElement("span"));this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));}','LogEntryMainElementContainer.prototype=new LogEntryElementContainer();function LogEntry(level,formattedMessage){this.level=level;this.formattedMessage=formattedMessage;this.rendered=false;}','LogEntry.prototype=new LogItem();copyProperties(LogEntry.prototype,{render:function(){var logEntry=this;var containerDomNode=this.group.contentDiv;if(isIe){this.formattedMessage=this.formattedMessage.replace(/\\r\\n/g,"\\r");this.unwrappedElementContainer=new LogEntryUnwrappedElementContainer(this,this.getUnwrappedDomContainer());this.wrappedElementContainer=new LogEntryWrappedElementContainer(this,this.getWrappedDomContainer());this.elementContainers=[this.unwrappedElementContainer,this.wrappedElementContainer];}else{this.mainElementContainer=new LogEntryMainElementContainer(this,this.getMainDomContainer());this.elementContainers=[this.mainElementContainer];}','this.content=this.formattedMessage;this.rendered=true;},setContent:function(content,wrappedContent){if(content!=this.content){if(isIe&&(content!==this.formattedMessage)){content=content.replace(/\\r\\n/g,"\\r");}','for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setContent(content,wrappedContent);}','this.content=content;}},getSearchMatches:function(){var matches=[];var i,len;if(isIe){var unwrappedEls=getElementsByClass(this.unwrappedElementContainer.mainDiv,"searchterm","span");var wrappedEls=getElementsByClass(this.wrappedElementContainer.mainDiv,"searchterm","span");for(i=0,len=unwrappedEls.length;i<len;i++){matches[i]=new Match(this.level,null,unwrappedEls[i],wrappedEls[i]);}}else{var els=getElementsByClass(this.mainElementContainer.mainDiv,"searchterm","span");for(i=0,len=els.length;i<len;i++){matches[i]=new Match(this.level,els[i]);}}','return matches;},setSearchMatch:function(isMatch){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].setSearchMatch(isMatch);}},clearSearch:function(){for(var i=0,len=this.elementContainers.length;i<len;i++){this.elementContainers[i].clearSearch();}},accept:function(visitor){visitor.visitLogEntry(this);},serialize:function(items){items.push([LogItem.serializedItemKeys.LOG_ENTRY,this.level,this.formattedMessage]);}});function LogItemVisitor(){}','LogItemVisitor.prototype={visit:function(logItem){},visitParent:function(logItem){if(logItem.group){logItem.group.accept(this);}},visitChildren:function(logItem){for(var i=0,len=logItem.children.length;i<len;i++){logItem.children[i].accept(this);}},visitLogEntry:function(logEntry){this.visit(logEntry);},visitSeparator:function(separator){this.visit(separator);},visitGroup:function(group){this.visit(group);}};function GroupFlattener(){this.logEntriesAndSeparators=[];}','GroupFlattener.prototype=new LogItemVisitor();GroupFlattener.prototype.visitGroup=function(group){this.visitChildren(group);};GroupFlattener.prototype.visitLogEntry=function(logEntry){this.logEntriesAndSeparators.push(logEntry);};GroupFlattener.prototype.visitSeparator=function(separator){this.logEntriesAndSeparators.push(separator);};window.onload=function(){if(location.search){var queryBits=unescape(location.search).substr(1).split("&"),nameValueBits;for(var i=0,len=queryBits.length;i<len;i++){nameValueBits=queryBits[i].split("=");if(nameValueBits[0]=="log4javascript_domain"){document.domain=nameValueBits[1];break;}}}','logMainContainer=$("log");if(isIePre7){addClass(logMainContainer,"oldIe");}','rootGroup=new Group("root",true);rootGroup.render();currentGroup=rootGroup;setCommandInputWidth();setLogContainerHeight();toggleLoggingEnabled();toggleSearchEnabled();toggleSearchFilter();toggleSearchHighlight();applyFilters();checkAllLevels();toggleWrap();toggleNewestAtTop();toggleScrollToLatest();renderQueuedLogItems();loaded=true;$("command").value="";$("command").autocomplete="off";$("command").onkeydown=function(evt){evt=getEvent(evt);if(evt.keyCode==10||evt.keyCode==13){evalCommandLine();stopPropagation(evt);}else if(evt.keyCode==27){this.value="";this.focus();}else if(evt.keyCode==38&&commandHistory.length>0){currentCommandIndex=Math.max(0,currentCommandIndex-1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}else if(evt.keyCode==40&&commandHistory.length>0){currentCommandIndex=Math.min(commandHistory.length-1,currentCommandIndex+1);this.value=commandHistory[currentCommandIndex];moveCaretToEnd(this);}};$("command").onkeypress=function(evt){evt=getEvent(evt);if(evt.keyCode==38&&commandHistory.length>0&&evt.preventDefault){evt.preventDefault();}};$("command").onkeyup=function(evt){evt=getEvent(evt);if(evt.keyCode==27&&evt.preventDefault){evt.preventDefault();this.focus();}};document.onkeydown=function keyEventHandler(evt){evt=getEvent(evt);switch(evt.keyCode){case 69:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){evalLastCommand();cancelKeyEvent(evt);return false;}','break;case 75:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusSearch();cancelKeyEvent(evt);return false;}','break;case 40:case 76:if(evt.shiftKey&&(evt.ctrlKey||evt.metaKey)){focusCommandLine();cancelKeyEvent(evt);return false;}','break;}};setTimeout(setLogContainerHeight,20);setShowCommandLine(showCommandLine);doSearch();};window.onunload=function(){if(mainWindowExists()){appender.unload();}','appender=null;};function toggleLoggingEnabled(){setLoggingEnabled($("enableLogging").checked);}','function setLoggingEnabled(enable){loggingEnabled=enable;}','var appender=null;function setAppender(appenderParam){appender=appenderParam;}','function setShowCloseButton(showCloseButton){$("closeButton").style.display=showCloseButton?"inline":"none";}','function setShowHideButton(showHideButton){$("hideButton").style.display=showHideButton?"inline":"none";}','var newestAtTop=false;function LogItemContentReverser(){}','LogItemContentReverser.prototype=new LogItemVisitor();LogItemContentReverser.prototype.visitGroup=function(group){group.reverseChildren();this.visitChildren(group);};function setNewestAtTop(isNewestAtTop){var oldNewestAtTop=newestAtTop;var i,iLen,j,jLen;newestAtTop=Boolean(isNewestAtTop);if(oldNewestAtTop!=newestAtTop){var visitor=new LogItemContentReverser();rootGroup.accept(visitor);if(currentSearch){var currentMatch=currentSearch.matches[currentMatchIndex];var matchIndex=0;var matches=[];var actOnLogEntry=function(logEntry){var logEntryMatches=logEntry.getSearchMatches();for(j=0,jLen=logEntryMatches.length;j<jLen;j++){matches[matchIndex]=logEntryMatches[j];if(currentMatch&&logEntryMatches[j].equals(currentMatch)){currentMatchIndex=matchIndex;}','matchIndex++;}};if(newestAtTop){for(i=logEntries.length-1;i>=0;i--){actOnLogEntry(logEntries[i]);}}else{for(i=0,iLen=logEntries.length;i<iLen;i++){actOnLogEntry(logEntries[i]);}}','currentSearch.matches=matches;if(currentMatch){currentMatch.setCurrent();}}else if(scrollToLatest){doScrollToLatest();}}','$("newestAtTop").checked=isNewestAtTop;}','function toggleNewestAtTop(){var isNewestAtTop=$("newestAtTop").checked;setNewestAtTop(isNewestAtTop);}','var scrollToLatest=true;function setScrollToLatest(isScrollToLatest){scrollToLatest=isScrollToLatest;if(scrollToLatest){doScrollToLatest();}','$("scrollToLatest").checked=isScrollToLatest;}','function toggleScrollToLatest(){var isScrollToLatest=$("scrollToLatest").checked;setScrollToLatest(isScrollToLatest);}','function doScrollToLatest(){var l=logMainContainer;if(typeof l.scrollTop!="undefined"){if(newestAtTop){l.scrollTop=0;}else{var latestLogEntry=l.lastChild;if(latestLogEntry){l.scrollTop=l.scrollHeight;}}}}','var closeIfOpenerCloses=true;function setCloseIfOpenerCloses(isCloseIfOpenerCloses){closeIfOpenerCloses=isCloseIfOpenerCloses;}','var maxMessages=null;function setMaxMessages(max){maxMessages=max;pruneLogEntries();}','var showCommandLine=false;function setShowCommandLine(isShowCommandLine){showCommandLine=isShowCommandLine;if(loaded){$("commandLine").style.display=showCommandLine?"block":"none";setCommandInputWidth();setLogContainerHeight();}}','function focusCommandLine(){if(loaded){$("command").focus();}}','function focusSearch(){if(loaded){$("searchBox").focus();}}','function getLogItems(){var items=[];for(var i=0,len=logItems.length;i<len;i++){logItems[i].serialize(items);}','return items;}','function setLogItems(items){var loggingReallyEnabled=loggingEnabled;loggingEnabled=true;for(var i=0,len=items.length;i<len;i++){switch(items[i][0]){case LogItem.serializedItemKeys.LOG_ENTRY:log(items[i][1],items[i][2]);break;case LogItem.serializedItemKeys.GROUP_START:group(items[i][1]);break;case LogItem.serializedItemKeys.GROUP_END:groupEnd();break;}}','loggingEnabled=loggingReallyEnabled;}','function log(logLevel,formattedMessage){if(loggingEnabled){var logEntry=new LogEntry(logLevel,formattedMessage);logEntries.push(logEntry);logEntriesAndSeparators.push(logEntry);logItems.push(logEntry);currentGroup.addChild(logEntry);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}','logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}','function renderQueuedLogItems(){logQueuedEventsTimer=null;var pruned=pruneLogEntries();var initiallyHasMatches=currentSearch?currentSearch.hasMatches():false;for(var i=0,len=logItems.length;i<len;i++){if(!logItems[i].rendered){logItems[i].render();logItems[i].appendToLog();if(currentSearch&&(logItems[i]instanceof LogEntry)){currentSearch.applyTo(logItems[i]);}}}','if(currentSearch){if(pruned){if(currentSearch.hasVisibleMatches()){if(currentMatchIndex===null){setCurrentMatchIndex(0);}','displayMatches();}else{displayNoMatches();}}else if(!initiallyHasMatches&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}}','if(scrollToLatest){doScrollToLatest();}','unrenderedLogItemsExist=false;}','function pruneLogEntries(){if((maxMessages!==null)&&(logEntriesAndSeparators.length>maxMessages)){var numberToDelete=logEntriesAndSeparators.length-maxMessages;var prunedLogEntries=logEntriesAndSeparators.slice(0,numberToDelete);if(currentSearch){currentSearch.removeMatches(prunedLogEntries);}','var group;for(var i=0;i<numberToDelete;i++){group=logEntriesAndSeparators[i].group;array_remove(logItems,logEntriesAndSeparators[i]);array_remove(logEntries,logEntriesAndSeparators[i]);logEntriesAndSeparators[i].remove(true,true);if(group.children.length===0&&group!==currentGroup&&group!==rootGroup){array_remove(logItems,group);group.remove(true,true);}}','logEntriesAndSeparators=array_removeFromStart(logEntriesAndSeparators,numberToDelete);return true;}','return false;}','function group(name,startExpanded){if(loggingEnabled){initiallyExpanded=(typeof startExpanded==="undefined")?true:Boolean(startExpanded);var newGroup=new Group(name,false,initiallyExpanded);currentGroup.addChild(newGroup);currentGroup=newGroup;logItems.push(newGroup);if(loaded){if(logQueuedEventsTimer!==null){clearTimeout(logQueuedEventsTimer);}','logQueuedEventsTimer=setTimeout(renderQueuedLogItems,renderDelay);unrenderedLogItemsExist=true;}}}','function groupEnd(){currentGroup=(currentGroup===rootGroup)?rootGroup:currentGroup.group;}','function mainPageReloaded(){currentGroup=rootGroup;var separator=new Separator();logEntriesAndSeparators.push(separator);logItems.push(separator);currentGroup.addChild(separator);}','function closeWindow(){if(appender&&mainWindowExists()){appender.close(true);}else{window.close();}}','function hide(){if(appender&&mainWindowExists()){appender.hide();}}','var mainWindow=window;var windowId="log4javascriptConsoleWindow_"+new Date().getTime()+"_"+(""+Math.random()).substr(2);function setMainWindow(win){mainWindow=win;mainWindow[windowId]=window;if(opener&&closeIfOpenerCloses){pollOpener();}}','function pollOpener(){if(closeIfOpenerCloses){if(mainWindowExists()){setTimeout(pollOpener,500);}else{closeWindow();}}}','function mainWindowExists(){try{return(mainWindow&&!mainWindow.closed&&mainWindow[windowId]==window);}catch(ex){}','return false;}','var logLevels=["TRACE","DEBUG","INFO","WARN","ERROR","FATAL"];function getCheckBox(logLevel){return $("switch_"+logLevel);}','function getIeWrappedLogContainer(){return $("log_wrapped");}','function getIeUnwrappedLogContainer(){return $("log_unwrapped");}','function applyFilters(){for(var i=0;i<logLevels.length;i++){if(getCheckBox(logLevels[i]).checked){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}','updateSearchFromFilters();}','function toggleAllLevels(){var turnOn=$("switch_ALL").checked;for(var i=0;i<logLevels.length;i++){getCheckBox(logLevels[i]).checked=turnOn;if(turnOn){addClass(logMainContainer,logLevels[i]);}else{removeClass(logMainContainer,logLevels[i]);}}}','function checkAllLevels(){for(var i=0;i<logLevels.length;i++){if(!getCheckBox(logLevels[i]).checked){getCheckBox("ALL").checked=false;return;}}','getCheckBox("ALL").checked=true;}','function clearLog(){rootGroup.clear();currentGroup=rootGroup;logEntries=[];logItems=[];logEntriesAndSeparators=[];doSearch();}','function toggleWrap(){var enable=$("wrap").checked;if(enable){addClass(logMainContainer,"wrap");}else{removeClass(logMainContainer,"wrap");}','refreshCurrentMatch();}','var searchTimer=null;function scheduleSearch(){try{clearTimeout(searchTimer);}catch(ex){}','searchTimer=setTimeout(doSearch,500);}','function Search(searchTerm,isRegex,searchRegex,isCaseSensitive){this.searchTerm=searchTerm;this.isRegex=isRegex;this.searchRegex=searchRegex;this.isCaseSensitive=isCaseSensitive;this.matches=[];}','Search.prototype={hasMatches:function(){return this.matches.length>0;},hasVisibleMatches:function(){if(this.hasMatches()){for(var i=0;i<this.matches.length;i++){if(this.matches[i].isVisible()){return true;}}}','return false;},match:function(logEntry){var entryText=String(logEntry.formattedMessage);var matchesSearch=false;if(this.isRegex){matchesSearch=this.searchRegex.test(entryText);}else if(this.isCaseSensitive){matchesSearch=(entryText.indexOf(this.searchTerm)>-1);}else{matchesSearch=(entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase())>-1);}','return matchesSearch;},getNextVisibleMatchIndex:function(){for(var i=currentMatchIndex+1;i<this.matches.length;i++){if(this.matches[i].isVisible()){return i;}}','for(i=0;i<=currentMatchIndex;i++){if(this.matches[i].isVisible()){return i;}}','return-1;},getPreviousVisibleMatchIndex:function(){for(var i=currentMatchIndex-1;i>=0;i--){if(this.matches[i].isVisible()){return i;}}','for(var i=this.matches.length-1;i>=currentMatchIndex;i--){if(this.matches[i].isVisible()){return i;}}','return-1;},applyTo:function(logEntry){var doesMatch=this.match(logEntry);if(doesMatch){logEntry.group.expand();logEntry.setSearchMatch(true);var logEntryContent;var wrappedLogEntryContent;var searchTermReplacementStartTag="<span class=\\\"searchterm\\\">";var searchTermReplacementEndTag="<"+"/span>";var preTagName=isIe?"pre":"span";var preStartTag="<"+preTagName+" class=\\\"pre\\\">";var preEndTag="<"+"/"+preTagName+">";var startIndex=0;var searchIndex,matchedText,textBeforeMatch;if(this.isRegex){var flags=this.isCaseSensitive?"g":"gi";var capturingRegex=new RegExp("("+this.searchRegex.source+")",flags);var rnd=(""+Math.random()).substr(2);var startToken="%%s"+rnd+"%%";var endToken="%%e"+rnd+"%%";logEntryContent=logEntry.formattedMessage.replace(capturingRegex,startToken+"$1"+endToken);logEntryContent=escapeHtml(logEntryContent);var result;var searchString=logEntryContent;logEntryContent="";wrappedLogEntryContent="";while((searchIndex=searchString.indexOf(startToken,startIndex))>-1){var endTokenIndex=searchString.indexOf(endToken,searchIndex);matchedText=searchString.substring(searchIndex+startToken.length,endTokenIndex);textBeforeMatch=searchString.substring(startIndex,searchIndex);logEntryContent+=preStartTag+textBeforeMatch+preEndTag;logEntryContent+=searchTermReplacementStartTag+preStartTag+matchedText+','preEndTag+searchTermReplacementEndTag;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+','matchedText+searchTermReplacementEndTag;}','startIndex=endTokenIndex+endToken.length;}','logEntryContent+=preStartTag+searchString.substr(startIndex)+preEndTag;if(isIe){wrappedLogEntryContent+=searchString.substr(startIndex);}}else{logEntryContent="";wrappedLogEntryContent="";var searchTermReplacementLength=searchTermReplacementStartTag.length+','this.searchTerm.length+searchTermReplacementEndTag.length;var searchTermLength=this.searchTerm.length;var searchTermLowerCase=this.searchTerm.toLowerCase();var logTextLowerCase=logEntry.formattedMessage.toLowerCase();while((searchIndex=logTextLowerCase.indexOf(searchTermLowerCase,startIndex))>-1){matchedText=escapeHtml(logEntry.formattedMessage.substr(searchIndex,this.searchTerm.length));textBeforeMatch=escapeHtml(logEntry.formattedMessage.substring(startIndex,searchIndex));var searchTermReplacement=searchTermReplacementStartTag+','preStartTag+matchedText+preEndTag+searchTermReplacementEndTag;logEntryContent+=preStartTag+textBeforeMatch+preEndTag+searchTermReplacement;if(isIe){wrappedLogEntryContent+=textBeforeMatch+searchTermReplacementStartTag+','matchedText+searchTermReplacementEndTag;}','startIndex=searchIndex+searchTermLength;}','var textAfterLastMatch=escapeHtml(logEntry.formattedMessage.substr(startIndex));logEntryContent+=preStartTag+textAfterLastMatch+preEndTag;if(isIe){wrappedLogEntryContent+=textAfterLastMatch;}}','logEntry.setContent(logEntryContent,wrappedLogEntryContent);var logEntryMatches=logEntry.getSearchMatches();this.matches=this.matches.concat(logEntryMatches);}else{logEntry.setSearchMatch(false);logEntry.setContent(logEntry.formattedMessage,logEntry.formattedMessage);}','return doesMatch;},removeMatches:function(logEntries){var matchesToRemoveCount=0;var currentMatchRemoved=false;var matchesToRemove=[];var i,iLen,j,jLen;for(i=0,iLen=this.matches.length;i<iLen;i++){for(j=0,jLen=logEntries.length;j<jLen;j++){if(this.matches[i].belongsTo(logEntries[j])){matchesToRemove.push(this.matches[i]);if(i===currentMatchIndex){currentMatchRemoved=true;}}}}','var newMatch=currentMatchRemoved?null:this.matches[currentMatchIndex];if(currentMatchRemoved){for(i=currentMatchIndex,iLen=this.matches.length;i<iLen;i++){if(this.matches[i].isVisible()&&!array_contains(matchesToRemove,this.matches[i])){newMatch=this.matches[i];break;}}}','for(i=0,iLen=matchesToRemove.length;i<iLen;i++){array_remove(this.matches,matchesToRemove[i]);matchesToRemove[i].remove();}','if(this.hasVisibleMatches()){if(newMatch===null){setCurrentMatchIndex(0);}else{var newMatchIndex=0;for(i=0,iLen=this.matches.length;i<iLen;i++){if(newMatch===this.matches[i]){newMatchIndex=i;break;}}','setCurrentMatchIndex(newMatchIndex);}}else{currentMatchIndex=null;displayNoMatches();}}};function getPageOffsetTop(el,container){var currentEl=el;var y=0;while(currentEl&&currentEl!=container){y+=currentEl.offsetTop;currentEl=currentEl.offsetParent;}','return y;}','function scrollIntoView(el){var logContainer=logMainContainer;if(!$("wrap").checked){var logContainerLeft=logContainer.scrollLeft;var logContainerRight=logContainerLeft+logContainer.offsetWidth;var elLeft=el.offsetLeft;var elRight=elLeft+el.offsetWidth;if(elLeft<logContainerLeft||elRight>logContainerRight){logContainer.scrollLeft=elLeft-(logContainer.offsetWidth-el.offsetWidth)/2;}}','var logContainerTop=logContainer.scrollTop;var logContainerBottom=logContainerTop+logContainer.offsetHeight;var elTop=getPageOffsetTop(el)-getToolBarsHeight();var elBottom=elTop+el.offsetHeight;if(elTop<logContainerTop||elBottom>logContainerBottom){logContainer.scrollTop=elTop-(logContainer.offsetHeight-el.offsetHeight)/2;}}','function Match(logEntryLevel,spanInMainDiv,spanInUnwrappedPre,spanInWrappedDiv){this.logEntryLevel=logEntryLevel;this.spanInMainDiv=spanInMainDiv;if(isIe){this.spanInUnwrappedPre=spanInUnwrappedPre;this.spanInWrappedDiv=spanInWrappedDiv;}','this.mainSpan=isIe?spanInUnwrappedPre:spanInMainDiv;}','Match.prototype={equals:function(match){return this.mainSpan===match.mainSpan;},setCurrent:function(){if(isIe){addClass(this.spanInUnwrappedPre,"currentmatch");addClass(this.spanInWrappedDiv,"currentmatch");var elementToScroll=$("wrap").checked?this.spanInWrappedDiv:this.spanInUnwrappedPre;scrollIntoView(elementToScroll);}else{addClass(this.spanInMainDiv,"currentmatch");scrollIntoView(this.spanInMainDiv);}},belongsTo:function(logEntry){if(isIe){return isDescendant(this.spanInUnwrappedPre,logEntry.unwrappedPre);}else{return isDescendant(this.spanInMainDiv,logEntry.mainDiv);}},setNotCurrent:function(){if(isIe){removeClass(this.spanInUnwrappedPre,"currentmatch");removeClass(this.spanInWrappedDiv,"currentmatch");}else{removeClass(this.spanInMainDiv,"currentmatch");}},isOrphan:function(){return isOrphan(this.mainSpan);},isVisible:function(){return getCheckBox(this.logEntryLevel).checked;},remove:function(){if(isIe){this.spanInUnwrappedPre=null;this.spanInWrappedDiv=null;}else{this.spanInMainDiv=null;}}};var currentSearch=null;var currentMatchIndex=null;function doSearch(){var searchBox=$("searchBox");var searchTerm=searchBox.value;var isRegex=$("searchRegex").checked;var isCaseSensitive=$("searchCaseSensitive").checked;var i;if(searchTerm===""){$("searchReset").disabled=true;$("searchNav").style.display="none";removeClass(document.body,"searching");removeClass(searchBox,"hasmatches");removeClass(searchBox,"nomatches");for(i=0;i<logEntries.length;i++){logEntries[i].clearSearch();logEntries[i].setContent(logEntries[i].formattedMessage,logEntries[i].formattedMessage);}','currentSearch=null;setLogContainerHeight();}else{$("searchReset").disabled=false;$("searchNav").style.display="block";var searchRegex;var regexValid;if(isRegex){try{searchRegex=isCaseSensitive?new RegExp(searchTerm,"g"):new RegExp(searchTerm,"gi");regexValid=true;replaceClass(searchBox,"validregex","invalidregex");searchBox.title="Valid regex";}catch(ex){regexValid=false;replaceClass(searchBox,"invalidregex","validregex");searchBox.title="Invalid regex: "+(ex.message?ex.message:(ex.description?ex.description:"unknown error"));return;}}else{searchBox.title="";removeClass(searchBox,"validregex");removeClass(searchBox,"invalidregex");}','addClass(document.body,"searching");currentSearch=new Search(searchTerm,isRegex,searchRegex,isCaseSensitive);for(i=0;i<logEntries.length;i++){currentSearch.applyTo(logEntries[i]);}','setLogContainerHeight();if(currentSearch.hasVisibleMatches()){setCurrentMatchIndex(0);displayMatches();}else{displayNoMatches();}}}','function updateSearchFromFilters(){if(currentSearch){if(currentSearch.hasMatches()){if(currentMatchIndex===null){currentMatchIndex=0;}','var currentMatch=currentSearch.matches[currentMatchIndex];if(currentMatch.isVisible()){displayMatches();setCurrentMatchIndex(currentMatchIndex);}else{currentMatch.setNotCurrent();var nextVisibleMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextVisibleMatchIndex>-1){setCurrentMatchIndex(nextVisibleMatchIndex);displayMatches();}else{displayNoMatches();}}}else{displayNoMatches();}}}','function refreshCurrentMatch(){if(currentSearch&&currentSearch.hasVisibleMatches()){setCurrentMatchIndex(currentMatchIndex);}}','function displayMatches(){replaceClass($("searchBox"),"hasmatches","nomatches");$("searchBox").title=""+currentSearch.matches.length+" matches found";$("searchNav").style.display="block";setLogContainerHeight();}','function displayNoMatches(){replaceClass($("searchBox"),"nomatches","hasmatches");$("searchBox").title="No matches found";$("searchNav").style.display="none";setLogContainerHeight();}','function toggleSearchEnabled(enable){enable=(typeof enable=="undefined")?!$("searchDisable").checked:enable;$("searchBox").disabled=!enable;$("searchReset").disabled=!enable;$("searchRegex").disabled=!enable;$("searchNext").disabled=!enable;$("searchPrevious").disabled=!enable;$("searchCaseSensitive").disabled=!enable;$("searchNav").style.display=(enable&&($("searchBox").value!=="")&&currentSearch&&currentSearch.hasVisibleMatches())?"block":"none";if(enable){removeClass($("search"),"greyedout");addClass(document.body,"searching");if($("searchHighlight").checked){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}','if($("searchFilter").checked){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}','$("searchDisable").checked=!enable;}else{addClass($("search"),"greyedout");removeClass(document.body,"searching");removeClass(logMainContainer,"searchhighlight");removeClass(logMainContainer,"searchfilter");}','setLogContainerHeight();}','function toggleSearchFilter(){var enable=$("searchFilter").checked;if(enable){addClass(logMainContainer,"searchfilter");}else{removeClass(logMainContainer,"searchfilter");}','refreshCurrentMatch();}','function toggleSearchHighlight(){var enable=$("searchHighlight").checked;if(enable){addClass(logMainContainer,"searchhighlight");}else{removeClass(logMainContainer,"searchhighlight");}}','function clearSearch(){$("searchBox").value="";doSearch();}','function searchNext(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var nextMatchIndex=currentSearch.getNextVisibleMatchIndex();if(nextMatchIndex>currentMatchIndex||confirm("Reached the end of the page. Start from the top?")){setCurrentMatchIndex(nextMatchIndex);}}}','function searchPrevious(){if(currentSearch!==null&&currentMatchIndex!==null){currentSearch.matches[currentMatchIndex].setNotCurrent();var previousMatchIndex=currentSearch.getPreviousVisibleMatchIndex();if(previousMatchIndex<currentMatchIndex||confirm("Reached the start of the page. Continue from the bottom?")){setCurrentMatchIndex(previousMatchIndex);}}}','function setCurrentMatchIndex(index){currentMatchIndex=index;currentSearch.matches[currentMatchIndex].setCurrent();}','function addClass(el,cssClass){if(!hasClass(el,cssClass)){if(el.className){el.className+=" "+cssClass;}else{el.className=cssClass;}}}','function hasClass(el,cssClass){if(el.className){var classNames=el.className.split(" ");return array_contains(classNames,cssClass);}','return false;}','function removeClass(el,cssClass){if(hasClass(el,cssClass)){var existingClasses=el.className.split(" ");var newClasses=[];for(var i=0,len=existingClasses.length;i<len;i++){if(existingClasses[i]!=cssClass){newClasses[newClasses.length]=existingClasses[i];}}','el.className=newClasses.join(" ");}}','function replaceClass(el,newCssClass,oldCssClass){removeClass(el,oldCssClass);addClass(el,newCssClass);}','function getElementsByClass(el,cssClass,tagName){var elements=el.getElementsByTagName(tagName);var matches=[];for(var i=0,len=elements.length;i<len;i++){if(hasClass(elements[i],cssClass)){matches.push(elements[i]);}}','return matches;}','function $(id){return document.getElementById(id);}','function isDescendant(node,ancestorNode){while(node!=null){if(node===ancestorNode){return true;}','node=node.parentNode;}','return false;}','function isOrphan(node){var currentNode=node;while(currentNode){if(currentNode==document.body){return false;}','currentNode=currentNode.parentNode;}','return true;}','function escapeHtml(str){return str.replace(/&/g,"&amp;").replace(/[<]/g,"&lt;").replace(/>/g,"&gt;");}','function getWindowWidth(){if(window.innerWidth){return window.innerWidth;}else if(document.documentElement&&document.documentElement.clientWidth){return document.documentElement.clientWidth;}else if(document.body){return document.body.clientWidth;}','return 0;}','function getWindowHeight(){if(window.innerHeight){return window.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight;}else if(document.body){return document.body.clientHeight;}','return 0;}','function getToolBarsHeight(){return $("switches").offsetHeight;}','function getChromeHeight(){var height=getToolBarsHeight();if(showCommandLine){height+=$("commandLine").offsetHeight;}','return height;}','function setLogContainerHeight(){if(logMainContainer){var windowHeight=getWindowHeight();$("body").style.height=getWindowHeight()+"px";logMainContainer.style.height=""+','Math.max(0,windowHeight-getChromeHeight())+"px";}}','function setCommandInputWidth(){if(showCommandLine){$("command").style.width=""+Math.max(0,$("commandLineContainer").offsetWidth-','($("evaluateButton").offsetWidth+13))+"px";}}','window.onresize=function(){setCommandInputWidth();setLogContainerHeight();};if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i<len;i++){this[this.length]=arguments[i];}','return this.length;};}','if(!Array.prototype.pop){Array.prototype.pop=function(){if(this.length>0){var val=this[this.length-1];this.length=this.length-1;return val;}};}','if(!Array.prototype.shift){Array.prototype.shift=function(){if(this.length>0){var firstItem=this[0];for(var i=0,len=this.length-1;i<len;i++){this[i]=this[i+1];}','this.length=this.length-1;return firstItem;}};}','if(!Array.prototype.splice){Array.prototype.splice=function(startIndex,deleteCount){var itemsAfterDeleted=this.slice(startIndex+deleteCount);var itemsDeleted=this.slice(startIndex,startIndex+deleteCount);this.length=startIndex;var argumentsArray=[];for(var i=0,len=arguments.length;i<len;i++){argumentsArray[i]=arguments[i];}','var itemsToAppend=(argumentsArray.length>2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i<len;i++){this.push(itemsToAppend[i]);}','return itemsDeleted;};}','function array_remove(arr,val){var index=-1;for(var i=0,len=arr.length;i<len;i++){if(arr[i]===val){index=i;break;}}','if(index>=0){arr.splice(index,1);return index;}else{return false;}}','function array_removeFromStart(array,numberToRemove){if(Array.prototype.splice){array.splice(0,numberToRemove);}else{for(var i=numberToRemove,len=array.length;i<len;i++){array[i-numberToRemove]=array[i];}','array.length=array.length-numberToRemove;}','return array;}','function array_contains(arr,val){for(var i=0,len=arr.length;i<len;i++){if(arr[i]==val){return true;}}','return false;}','function getErrorMessage(ex){if(ex.message){return ex.message;}else if(ex.description){return ex.description;}','return""+ex;}','function moveCaretToEnd(input){if(input.setSelectionRange){input.focus();var length=input.value.length;input.setSelectionRange(length,length);}else if(input.createTextRange){var range=input.createTextRange();range.collapse(false);range.select();}','input.focus();}','function stopPropagation(evt){if(evt.stopPropagation){evt.stopPropagation();}else if(typeof evt.cancelBubble!="undefined"){evt.cancelBubble=true;}}','function getEvent(evt){return evt?evt:event;}','function getTarget(evt){return evt.target?evt.target:evt.srcElement;}','function getRelatedTarget(evt){if(evt.relatedTarget){return evt.relatedTarget;}else if(evt.srcElement){switch(evt.type){case"mouseover":return evt.fromElement;case"mouseout":return evt.toElement;default:return evt.srcElement;}}}','function cancelKeyEvent(evt){evt.returnValue=false;stopPropagation(evt);}','function evalCommandLine(){var expr=$("command").value;evalCommand(expr);$("command").value="";}','function evalLastCommand(){if(lastCommand!=null){evalCommand(lastCommand);}}','var lastCommand=null;var commandHistory=[];var currentCommandIndex=0;function evalCommand(expr){if(appender){appender.evalCommandAndAppend(expr);}else{var prefix=">>> "+expr+"\\r\\n";try{log("INFO",prefix+eval(expr));}catch(ex){log("ERROR",prefix+"Error: "+getErrorMessage(ex));}}','if(expr!=commandHistory[commandHistory.length-1]){commandHistory.push(expr);if(appender){appender.storeCommandHistory(commandHistory);}}','currentCommandIndex=(expr==commandHistory[currentCommandIndex])?currentCommandIndex+1:commandHistory.length;lastCommand=expr;}','//]]>','</script>','<style type="text/css">','body{background-color:white;color:black;padding:0;margin:0;font-family:tahoma,verdana,arial,helvetica,sans-serif;overflow:hidden}div#switchesContainer input{margin-bottom:0}div.toolbar{border-top:solid #ffffff 1px;border-bottom:solid #aca899 1px;background-color:#f1efe7;padding:3px 5px;font-size:68.75%}div.toolbar,div#search input{font-family:tahoma,verdana,arial,helvetica,sans-serif}div.toolbar input.button{padding:0 5px;font-size:100%}div.toolbar input.hidden{display:none}div#switches input#clearButton{margin-left:20px}div#levels label{font-weight:bold}div#levels label,div#options label{margin-right:5px}div#levels label#wrapLabel{font-weight:normal}div#search label{margin-right:10px}div#search label.searchboxlabel{margin-right:0}div#search input{font-size:100%}div#search input.validregex{color:green}div#search input.invalidregex{color:red}div#search input.nomatches{color:white;background-color:#ff6666}div#search input.nomatches{color:white;background-color:#ff6666}div#searchNav{display:none}div#commandLine{display:none}div#commandLine input#command{font-size:100%;font-family:Courier New,Courier}div#commandLine input#evaluateButton{}*.greyedout{color:gray !important;border-color:gray !important}*.greyedout *.alwaysenabled{color:black}*.unselectable{-khtml-user-select:none;-moz-user-select:none;user-select:none}div#log{font-family:Courier New,Courier;font-size:75%;width:100%;overflow:auto;clear:both;position:relative}div.group{border-color:#cccccc;border-style:solid;border-width:1px 0 1px 1px;overflow:visible}div.oldIe div.group,div.oldIe div.group *,div.oldIe *.logentry{height:1%}div.group div.groupheading span.expander{border:solid black 1px;font-family:Courier New,Courier;font-size:0.833em;background-color:#eeeeee;position:relative;top:-1px;color:black;padding:0 2px;cursor:pointer;cursor:hand;height:1%}div.group div.groupcontent{margin-left:10px;padding-bottom:2px;overflow:visible}div.group div.expanded{display:block}div.group div.collapsed{display:none}*.logentry{overflow:visible;display:none;white-space:pre}span.pre{white-space:pre}pre.unwrapped{display:inline !important}pre.unwrapped pre.pre,div.wrapped pre.pre{display:inline}div.wrapped pre.pre{white-space:normal}div.wrapped{display:none}body.searching *.logentry span.currentmatch{color:white !important;background-color:green !important}body.searching div.searchhighlight *.logentry span.searchterm{color:black;background-color:yellow}div.wrap *.logentry{white-space:normal !important;border-width:0 0 1px 0;border-color:#dddddd;border-style:dotted}div.wrap #log_wrapped,#log_unwrapped{display:block}div.wrap #log_unwrapped,#log_wrapped{display:none}div.wrap *.logentry span.pre{overflow:visible;white-space:normal}div.wrap *.logentry pre.unwrapped{display:none}div.wrap *.logentry span.wrapped{display:inline}div.searchfilter *.searchnonmatch{display:none !important}div#log *.TRACE,label#label_TRACE{color:#666666}div#log *.DEBUG,label#label_DEBUG{color:green}div#log *.INFO,label#label_INFO{color:#000099}div#log *.WARN,label#label_WARN{color:#999900}div#log *.ERROR,label#label_ERROR{color:red}div#log *.FATAL,label#label_FATAL{color:#660066}div.TRACE#log *.TRACE,div.DEBUG#log *.DEBUG,div.INFO#log *.INFO,div.WARN#log *.WARN,div.ERROR#log *.ERROR,div.FATAL#log *.FATAL{display:block}div#log div.separator{background-color:#cccccc;margin:5px 0;line-height:1px}','</style>','</head>','<body id="body">','<div id="switchesContainer">','<div id="switches">','<div id="levels" class="toolbar">','Filters:','<input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>','<input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>','<input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>','<input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>','<input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>','<input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>','<input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>','</div>','<div id="search" class="toolbar">','<label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />','<input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />','<input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>','<input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>','<input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>','<div id="searchNav">','<input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />','<input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />','<input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>','<input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>','</div>','</div>','<div id="options" class="toolbar">','Options:','<input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>','<input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>','<input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>','<input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>','<input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />','<input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />','<input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />','</div>','</div>','</div>','<div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>','<div id="commandLine" class="toolbar">','<div id="commandLineContainer">','<input type="text" id="command" title="Enter a JavaScript command here and hit return or press \'Evaluate\'" />','<input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />','</div>','</div>','</body>','</html>',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;var showLogEntryDeleteButtons=this.defaults.showLogEntryDeleteButtons;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}\r
+return true;};var consoleWindowExists=function(){return(consoleWindowLoaded&&isSupported&&!consoleClosed);};this.isNewestMessageAtTop=function(){return newestMessageAtTop;};this.setNewestMessageAtTop=function(newestMessageAtTopParam){newestMessageAtTop=bool(newestMessageAtTopParam);if(consoleWindowExists()){getConsoleWindow().setNewestAtTop(newestMessageAtTop);}};this.isScrollToLatestMessage=function(){return scrollToLatestMessage;};this.setScrollToLatestMessage=function(scrollToLatestMessageParam){scrollToLatestMessage=bool(scrollToLatestMessageParam);if(consoleWindowExists()){getConsoleWindow().setScrollToLatest(scrollToLatestMessage);}};this.getWidth=function(){return width;};this.setWidth=function(widthParam){if(checkCanConfigure("width")){width=extractStringFromParam(widthParam,width);}};this.getHeight=function(){return height;};this.setHeight=function(heightParam){if(checkCanConfigure("height")){height=extractStringFromParam(heightParam,height);}};this.getMaxMessages=function(){return maxMessages;};this.setMaxMessages=function(maxMessagesParam){maxMessages=extractIntFromParam(maxMessagesParam,maxMessages);if(consoleWindowExists()){getConsoleWindow().setMaxMessages(maxMessages);}};this.isShowCommandLine=function(){return showCommandLine;};this.setShowCommandLine=function(showCommandLineParam){showCommandLine=bool(showCommandLineParam);if(consoleWindowExists()){getConsoleWindow().setShowCommandLine(showCommandLine);}};this.isShowHideButton=function(){return showHideButton;};this.setShowHideButton=function(showHideButtonParam){showHideButton=bool(showHideButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowHideButton(showHideButton);}};this.isShowCloseButton=function(){return showCloseButton;};this.setShowCloseButton=function(showCloseButtonParam){showCloseButton=bool(showCloseButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowCloseButton(showCloseButton);}};this.getCommandLineObjectExpansionDepth=function(){return commandLineObjectExpansionDepth;};this.setCommandLineObjectExpansionDepth=function(commandLineObjectExpansionDepthParam){commandLineObjectExpansionDepth=extractIntFromParam(commandLineObjectExpansionDepthParam,commandLineObjectExpansionDepth);};var minimized=initiallyMinimized;this.isInitiallyMinimized=function(){return initiallyMinimized;};this.setInitiallyMinimized=function(initiallyMinimizedParam){if(checkCanConfigure("initiallyMinimized")){initiallyMinimized=bool(initiallyMinimizedParam);minimized=initiallyMinimized;}};this.isUseDocumentWrite=function(){return useDocumentWrite;};this.setUseDocumentWrite=function(useDocumentWriteParam){if(checkCanConfigure("useDocumentWrite")){useDocumentWrite=bool(useDocumentWriteParam);}};function QueuedLoggingEvent(loggingEvent,formattedMessage){this.loggingEvent=loggingEvent;this.levelName=loggingEvent.level.name;this.formattedMessage=formattedMessage;}\r
+QueuedLoggingEvent.prototype.append=function(){getConsoleWindow().log(this.levelName,this.formattedMessage);};function QueuedGroup(name,initiallyExpanded){this.name=name;this.initiallyExpanded=initiallyExpanded;}\r
+QueuedGroup.prototype.append=function(){getConsoleWindow().group(this.name,this.initiallyExpanded);};function QueuedGroupEnd(){}\r
+QueuedGroupEnd.prototype.append=function(){getConsoleWindow().groupEnd();};var checkAndAppend=function(){safeToAppend();if(!initialized){init();}else if(consoleClosed&&reopenWhenClosed){createWindow();}\r
+if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().format(loggingEvent);if(this.getLayout().ignoresThrowable()){formattedMessage+=loggingEvent.getThrowableStrRep();}\r
+queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){var currentLoggingEvent;while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}\r
+if(focusConsoleWindow){getConsoleWindow().focus();}};this.setAddedToLogger=function(logger){this.loggers.push(logger);if(enabled&&!lazyInit){init();}};this.clear=function(){if(consoleWindowExists()){getConsoleWindow().clearLog();}\r
+queuedLoggingEvents.length=0;};this.focus=function(){if(consoleWindowExists()){getConsoleWindow().focus();}};this.focusCommandLine=function(){if(consoleWindowExists()){getConsoleWindow().focusCommandLine();}};this.focusSearch=function(){if(consoleWindowExists()){getConsoleWindow().focusSearch();}};var commandWindow=window;this.getCommandWindow=function(){return commandWindow;};this.setCommandWindow=function(commandWindowParam){commandWindow=commandWindowParam;};this.executeLastCommand=function(){if(consoleWindowExists()){getConsoleWindow().evalLastCommand();}};var commandLayout=new PatternLayout("%m");this.getCommandLayout=function(){return commandLayout;};this.setCommandLayout=function(commandLayoutParam){commandLayout=commandLayoutParam;};this.evalCommandAndAppend=function(expr){var commandReturnValue={appendResult:true,isError:false};var commandOutput="";try{var result,i;if(!commandWindow.eval&&commandWindow.execScript){commandWindow.execScript("null");}\r
+var commandLineFunctionsHash={};for(i=0,len=commandLineFunctions.length;i<len;i++){commandLineFunctionsHash[commandLineFunctions[i][0]]=commandLineFunctions[i][1];}\r
+var objectsToRestore=[];var addObjectToRestore=function(name){objectsToRestore.push([name,commandWindow[name]]);};addObjectToRestore("appender");commandWindow.appender=appender;addObjectToRestore("commandReturnValue");commandWindow.commandReturnValue=commandReturnValue;addObjectToRestore("commandLineFunctionsHash");commandWindow.commandLineFunctionsHash=commandLineFunctionsHash;var addFunctionToWindow=function(name){addObjectToRestore(name);commandWindow[name]=function(){return this.commandLineFunctionsHash[name](appender,arguments,commandReturnValue);};};for(i=0,len=commandLineFunctions.length;i<len;i++){addFunctionToWindow(commandLineFunctions[i][0]);}\r
+if(commandWindow===window&&commandWindow.execScript){addObjectToRestore("evalExpr");addObjectToRestore("result");window.evalExpr=expr;commandWindow.execScript("window.result=eval(window.evalExpr);");result=window.result;}else{result=commandWindow.eval(expr);}\r
+commandOutput=isUndefined(result)?result:formatObjectExpansion(result,commandLineObjectExpansionDepth);for(i=0,len=objectsToRestore.length;i<len;i++){commandWindow[objectsToRestore[i][0]]=objectsToRestore[i][1];}}catch(ex){commandOutput="Error evaluating command: "+getExceptionStringRep(ex);commandReturnValue.isError=true;}\r
+if(commandReturnValue.appendResult){var message=">>> "+expr;if(!isUndefined(commandOutput)){message+=newLine+commandOutput;}\r
+var level=commandReturnValue.isError?Level.ERROR:Level.INFO;var loggingEvent=new LoggingEvent(null,new Date(),level,[message],null);var mainLayout=this.getLayout();this.setLayout(commandLayout);this.append(loggingEvent);this.setLayout(mainLayout);}};var commandLineFunctions=defaultCommandLineFunctions.concat([]);this.addCommandLineFunction=function(functionName,commandLineFunction){commandLineFunctions.push([functionName,commandLineFunction]);};var commandHistoryCookieName="log4javascriptCommandHistory";this.storeCommandHistory=function(commandHistory){setCookie(commandHistoryCookieName,commandHistory.join(","));};var writeHtml=function(doc){var lines=getConsoleHtmlLines();doc.open();for(var i=0,len=lines.length;i<len;i++){doc.writeln(lines[i]);}\r
+doc.close();};this.setEventTypes(["load","unload"]);var consoleWindowLoadHandler=function(){var win=getConsoleWindow();win.setAppender(appender);win.setNewestAtTop(newestMessageAtTop);win.setScrollToLatest(scrollToLatestMessage);win.setMaxMessages(maxMessages);win.setShowCommandLine(showCommandLine);win.setShowHideButton(showHideButton);win.setShowCloseButton(showCloseButton);win.setMainWindow(window);var storedValue=getCookie(commandHistoryCookieName);if(storedValue){win.commandHistory=storedValue.split(",");win.currentCommandIndex=win.commandHistory.length;}\r
+appender.dispatchEvent("load",{"win":win});};this.unload=function(){logLog.debug("unload "+this+", caller: "+this.unload.caller);if(!consoleClosed){logLog.debug("really doing unload "+this);consoleClosed=true;consoleWindowLoaded=false;consoleWindowCreated=false;appender.dispatchEvent("unload",{});}};var pollConsoleWindow=function(windowTest,interval,successCallback,errorMessage){function doPoll(){try{if(consoleClosed){clearInterval(poll);}\r
+if(windowTest(getConsoleWindow())){clearInterval(poll);successCallback();}}catch(ex){clearInterval(poll);isSupported=false;handleError(errorMessage,ex);}}\r
+var poll=setInterval(doPoll,interval);};var getConsoleUrl=function(){var documentDomainSet=(document.domain!=location.hostname);return useDocumentWrite?"":getBaseUrl()+"console.html"+\r
+(documentDomainSet?"?log4javascript_domain="+escape(document.domain):"");};if(inPage){var containerElement=null;var cssProperties=[];this.addCssProperty=function(name,value){if(checkCanConfigure("cssProperties")){cssProperties.push([name,value]);}};var windowCreationStarted=false;var iframeContainerDiv;var iframeId=uniqueId+"_InPageAppender_"+consoleAppenderId;this.hide=function(){if(initialized&&consoleWindowCreated){if(consoleWindowExists()){getConsoleWindow().$("command").blur();}\r
+iframeContainerDiv.style.display="none";minimized=true;}};this.show=function(){if(initialized){if(consoleWindowCreated){iframeContainerDiv.style.display="block";this.setShowCommandLine(showCommandLine);minimized=false;}else if(!windowCreationStarted){createWindow(true);}}};this.isVisible=function(){return!minimized&&!consoleClosed;};this.close=function(fromButton){if(!consoleClosed&&(!fromButton||confirm("This will permanently remove the console from the page. No more messages will be logged. Do you wish to continue?"))){iframeContainerDiv.parentNode.removeChild(iframeContainerDiv);this.unload();}};open=function(){var initErrorMessage="InPageAppender.open: unable to create console iframe";function finalInit(){try{if(!initiallyMinimized){appender.show();}\r
+consoleWindowLoadHandler();consoleWindowLoaded=true;appendQueuedLoggingEvents();}catch(ex){isSupported=false;handleError(initErrorMessage,ex);}}\r
+function writeToDocument(){try{var windowTest=function(win){return isLoaded(win);};if(useDocumentWrite){writeHtml(getConsoleWindow().document);}\r
+if(windowTest(getConsoleWindow())){finalInit();}else{pollConsoleWindow(windowTest,100,finalInit,initErrorMessage);}}catch(ex){isSupported=false;handleError(initErrorMessage,ex);}}\r
+minimized=false;iframeContainerDiv=containerElement.appendChild(document.createElement("div"));iframeContainerDiv.style.width=width;iframeContainerDiv.style.height=height;iframeContainerDiv.style.border="solid gray 1px";for(var i=0,len=cssProperties.length;i<len;i++){iframeContainerDiv.style[cssProperties[i][0]]=cssProperties[i][1];}\r
+var iframeSrc=useDocumentWrite?"":" src='"+getConsoleUrl()+"'";iframeContainerDiv.innerHTML="<iframe id='"+iframeId+"' name='"+iframeId+"' width='100%' height='100%' frameborder='0'"+iframeSrc+" scrolling='no'></iframe>";consoleClosed=false;var iframeDocumentExistsTest=function(win){try{return bool(win)&&bool(win.document);}catch(ex){return false;}};if(iframeDocumentExistsTest(getConsoleWindow())){writeToDocument();}else{pollConsoleWindow(iframeDocumentExistsTest,100,writeToDocument,initErrorMessage);}\r
+consoleWindowCreated=true;};createWindow=function(show){if(show||!initiallyMinimized){var pageLoadHandler=function(){if(!container){containerElement=document.createElement("div");containerElement.style.position="fixed";containerElement.style.left="0";containerElement.style.right="0";containerElement.style.bottom="0";document.body.appendChild(containerElement);appender.addCssProperty("borderWidth","1px 0 0 0");appender.addCssProperty("zIndex",1000000);open();}else{try{var el=document.getElementById(container);if(el.nodeType==1){containerElement=el;}\r
+open();}catch(ex){handleError("InPageAppender.init: invalid container element '"+container+"' supplied",ex);}}};if(pageLoaded&&container&&container.appendChild){containerElement=container;open();}else if(pageLoaded){pageLoadHandler();}else{log4javascript.addEventListener("load",pageLoadHandler);}\r
+windowCreationStarted=true;}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){var iframe=window.frames[iframeId];if(iframe){return iframe;}};safeToAppend=function(){if(isSupported&&!consoleClosed){if(consoleWindowCreated&&!consoleWindowLoaded&&getConsoleWindow()&&isLoaded(getConsoleWindow())){consoleWindowLoaded=true;}\r
+return consoleWindowLoaded;}\r
+return false;};}else{var useOldPopUp=appender.defaults.useOldPopUp;var complainAboutPopUpBlocking=appender.defaults.complainAboutPopUpBlocking;var reopenWhenClosed=this.defaults.reopenWhenClosed;this.isUseOldPopUp=function(){return useOldPopUp;};this.setUseOldPopUp=function(useOldPopUpParam){if(checkCanConfigure("useOldPopUp")){useOldPopUp=bool(useOldPopUpParam);}};this.isComplainAboutPopUpBlocking=function(){return complainAboutPopUpBlocking;};this.setComplainAboutPopUpBlocking=function(complainAboutPopUpBlockingParam){if(checkCanConfigure("complainAboutPopUpBlocking")){complainAboutPopUpBlocking=bool(complainAboutPopUpBlockingParam);}};this.isFocusPopUp=function(){return focusConsoleWindow;};this.setFocusPopUp=function(focusPopUpParam){focusConsoleWindow=bool(focusPopUpParam);};this.isReopenWhenClosed=function(){return reopenWhenClosed;};this.setReopenWhenClosed=function(reopenWhenClosedParam){reopenWhenClosed=bool(reopenWhenClosedParam);};this.close=function(){logLog.debug("close "+this);try{popUp.close();this.unload();}catch(ex){}};this.hide=function(){logLog.debug("hide "+this);if(consoleWindowExists()){this.close();}};this.show=function(){logLog.debug("show "+this);if(!consoleWindowCreated){open();}};this.isVisible=function(){return safeToAppend();};var popUp;open=function(){var windowProperties="width="+width+",height="+height+",status,resizable";var frameInfo="";try{var frameEl=window.frameElement;if(frameEl){frameInfo="_"+frameEl.tagName+"_"+(frameEl.name||frameEl.id||"");}}catch(e){frameInfo="_inaccessibleParentFrame";}\r
+var windowName="PopUp_"+location.host.replace(/[^a-z0-9]/gi,"_")+"_"+consoleAppenderId+frameInfo;if(!useOldPopUp||!useDocumentWrite){windowName=windowName+"_"+uniqueId;}\r
+var checkPopUpClosed=function(win){if(consoleClosed){return true;}else{try{return bool(win)&&win.closed;}catch(ex){}}\r
+return false;};var popUpClosedCallback=function(){if(!consoleClosed){appender.unload();}};function finalInit(){getConsoleWindow().setCloseIfOpenerCloses(!useOldPopUp||!useDocumentWrite);consoleWindowLoadHandler();consoleWindowLoaded=true;appendQueuedLoggingEvents();pollConsoleWindow(checkPopUpClosed,500,popUpClosedCallback,"PopUpAppender.checkPopUpClosed: error checking pop-up window");}\r
+try{popUp=window.open(getConsoleUrl(),windowName,windowProperties);consoleClosed=false;consoleWindowCreated=true;if(popUp&&popUp.document){if(useDocumentWrite&&useOldPopUp&&isLoaded(popUp)){popUp.mainPageReloaded();finalInit();}else{if(useDocumentWrite){writeHtml(popUp.document);}\r
+var popUpLoadedTest=function(win){return bool(win)&&isLoaded(win);};if(isLoaded(popUp)){finalInit();}else{pollConsoleWindow(popUpLoadedTest,100,finalInit,"PopUpAppender.init: unable to create console window");}}}else{isSupported=false;logLog.warn("PopUpAppender.init: pop-ups blocked, please unblock to use PopUpAppender");if(complainAboutPopUpBlocking){handleError("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");}}}catch(ex){handleError("PopUpAppender.init: error creating pop-up",ex);}};createWindow=function(){if(!initiallyMinimized){open();}};init=function(){createWindow();initialized=true;};getConsoleWindow=function(){return popUp;};safeToAppend=function(){if(isSupported&&!isUndefined(popUp)&&!consoleClosed){if(popUp.closed||(consoleWindowLoaded&&isUndefined(popUp.closed))){appender.unload();logLog.debug("PopUpAppender: pop-up closed");return false;}\r
+if(!consoleWindowLoaded&&isLoaded(popUp)){consoleWindowLoaded=true;}}\r
+return isSupported&&consoleWindowLoaded&&!consoleClosed;};}\r
+this.getConsoleWindow=getConsoleWindow;};ConsoleAppender.addGlobalCommandLineFunction=function(functionName,commandLineFunction){defaultCommandLineFunctions.push([functionName,commandLineFunction]);};function PopUpAppender(lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(false,null,lazyInit,initiallyMinimized,useDocumentWrite,width,height,this.defaults.focusPopUp);}\r
+PopUpAppender.prototype=new ConsoleAppender();PopUpAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,focusPopUp:false,lazyInit:true,useOldPopUp:true,complainAboutPopUpBlocking:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"600",height:"400",reopenWhenClosed:false,maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:true,showLogEntryDeleteButtons:true,useDocumentWrite:true};PopUpAppender.prototype.toString=function(){return"PopUpAppender";};log4javascript.PopUpAppender=PopUpAppender;function InPageAppender(container,lazyInit,initiallyMinimized,useDocumentWrite,width,height){this.create(true,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,false);}\r
+InPageAppender.prototype=new ConsoleAppender();InPageAppender.prototype.defaults={layout:new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),initiallyMinimized:false,lazyInit:true,newestMessageAtTop:false,scrollToLatestMessage:true,width:"100%",height:"220px",maxMessages:null,showCommandLine:true,commandLineObjectExpansionDepth:1,showHideButton:false,showCloseButton:false,showLogEntryDeleteButtons:true,useDocumentWrite:true};InPageAppender.prototype.toString=function(){return"InPageAppender";};log4javascript.InPageAppender=InPageAppender;log4javascript.InlineAppender=InPageAppender;})();function padWithSpaces(str,len){if(str.length<len){var spaces=[];var numberOfSpaces=Math.max(0,len-str.length);for(var i=0;i<numberOfSpaces;i++){spaces[i]=" ";}\r
+str+=spaces.join("");}\r
+return str;}\r
+(function(){function dir(obj){var maxLen=0;for(var p in obj){maxLen=Math.max(toStr(p).length,maxLen);}\r
+var propList=[];for(p in obj){var propNameStr="  "+padWithSpaces(toStr(p),maxLen+2);var propVal;try{propVal=splitIntoLines(toStr(obj[p])).join(padWithSpaces(newLine,maxLen+6));}catch(ex){propVal="[Error obtaining property. Details: "+getExceptionMessage(ex)+"]";}\r
+propList.push(propNameStr+propVal);}\r
+return propList.join(newLine);}\r
+var nodeTypes={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12};var preFormattedElements=["script","pre"];var emptyElements=["br","img","hr","param","link","area","input","col","base","meta"];var indentationUnit="  ";function getXhtml(rootNode,includeRootNode,indentation,startNewLine,preformatted){includeRootNode=(typeof includeRootNode=="undefined")?true:!!includeRootNode;if(typeof indentation!="string"){indentation="";}\r
+startNewLine=!!startNewLine;preformatted=!!preformatted;var xhtml;function isWhitespace(node){return((node.nodeType==nodeTypes.TEXT_NODE)&&/^[ \t\r\n]*$/.test(node.nodeValue));}\r
+function fixAttributeValue(attrValue){return attrValue.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;");}\r
+function getStyleAttributeValue(el){var stylePairs=el.style.cssText.split(";");var styleValue="";var isFirst=true;for(var j=0,len=stylePairs.length;j<len;j++){var nameValueBits=stylePairs[j].split(":");var props=[];if(!/^\s*$/.test(nameValueBits[0])){props.push(trim(nameValueBits[0]).toLowerCase()+":"+trim(nameValueBits[1]));}\r
+styleValue=props.join(";");}\r
+return styleValue;}\r
+function getNamespace(el){if(el.prefix){return el.prefix;}else if(el.outerHTML){var regex=new RegExp("<([^:]+):"+el.tagName+"[^>]*>","i");if(regex.test(el.outerHTML)){return RegExp.$1.toLowerCase();}}\r
+return"";}\r
+var lt="<";var gt=">";if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}\r
+xhtml+=tagName;for(i=0,len=rootNode.attributes.length;i<len;i++){var currentAttr=rootNode.attributes[i];if(!currentAttr.specified||currentAttr.nodeValue===null||currentAttr.nodeName.toLowerCase()==="style"||typeof currentAttr.nodeValue!=="string"||currentAttr.nodeName.indexOf("_moz")===0){continue;}\r
+xhtml+=" "+currentAttr.nodeName.toLowerCase()+"=\"";xhtml+=fixAttributeValue(currentAttr.nodeValue);xhtml+="\"";}\r
+if(rootNode.style.cssText){var styleValue=getStyleAttributeValue(rootNode);if(styleValue!==""){xhtml+=" style=\""+getStyleAttributeValue(rootNode)+"\"";}}\r
+if(array_contains(emptyElements,tagName)||(hasPrefix&&!rootNode.hasChildNodes())){xhtml+="/"+gt;}else{xhtml+=gt;var childStartNewLine=!(rootNode.childNodes.length===1&&rootNode.childNodes[0].nodeType===nodeTypes.TEXT_NODE);var childPreformatted=array_contains(preFormattedElements,tagName);for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation+indentationUnit,childStartNewLine,childPreformatted);}\r
+var endTag=lt+"/"+tagName+gt;xhtml+=childStartNewLine?newLine+indentation+endTag:endTag;}\r
+return xhtml;case nodeTypes.TEXT_NODE:if(isWhitespace(rootNode)){xhtml="";}else{if(preformatted){xhtml=rootNode.nodeValue;}else{var lines=splitIntoLines(trim(rootNode.nodeValue));var trimmedLines=[];for(var i=0,len=lines.length;i<len;i++){trimmedLines[i]=trim(lines[i]);}\r
+xhtml=trimmedLines.join(newLine+indentation);}\r
+if(startNewLine){xhtml=newLine+indentation+xhtml;}}\r
+return xhtml;case nodeTypes.CDATA_SECTION_NODE:return"<![CDA"+"TA["+rootNode.nodeValue+"]"+"]>"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation);}\r
+return xhtml;default:return"";}}else{xhtml="";for(var i=0,len=rootNode.childNodes.length;i<len;i++){xhtml+=getXhtml(rootNode.childNodes[i],true,indentation+indentationUnit);}\r
+return xhtml;}}\r
+function createCommandLineFunctions(){ConsoleAppender.addGlobalCommandLineFunction("$",function(appender,args,returnValue){return document.getElementById(args[0]);});ConsoleAppender.addGlobalCommandLineFunction("dir",function(appender,args,returnValue){var lines=[];for(var i=0,len=args.length;i<len;i++){lines[i]=dir(args[i]);}\r
+return lines.join(newLine+newLine);});ConsoleAppender.addGlobalCommandLineFunction("dirxml",function(appender,args,returnValue){var lines=[];for(var i=0,len=args.length;i<len;i++){var win=appender.getCommandWindow();lines[i]=getXhtml(args[i]);}\r
+return lines.join(newLine+newLine);});ConsoleAppender.addGlobalCommandLineFunction("cd",function(appender,args,returnValue){var win,message;if(args.length===0||args[0]===""){win=window;message="Command line set to run in main window";}else{if(args[0].window==args[0]){win=args[0];message="Command line set to run in frame '"+args[0].name+"'";}else{win=window.frames[args[0]];if(win){message="Command line set to run in frame '"+args[0]+"'";}else{returnValue.isError=true;message="Frame '"+args[0]+"' does not exist";win=appender.getCommandWindow();}}}\r
+appender.setCommandWindow(win);return message;});ConsoleAppender.addGlobalCommandLineFunction("clear",function(appender,args,returnValue){returnValue.appendResult=false;appender.clear();});ConsoleAppender.addGlobalCommandLineFunction("keys",function(appender,args,returnValue){var keys=[];for(var k in args[0]){keys.push(k);}\r
+return keys;});ConsoleAppender.addGlobalCommandLineFunction("values",function(appender,args,returnValue){var values=[];for(var k in args[0]){try{values.push(args[0][k]);}catch(ex){logLog.warn("values(): Unable to obtain value for key "+k+". Details: "+getExceptionMessage(ex));}}\r
+return values;});ConsoleAppender.addGlobalCommandLineFunction("expansionDepth",function(appender,args,returnValue){var expansionDepth=parseInt(args[0],10);if(isNaN(expansionDepth)||expansionDepth<0){returnValue.isError=true;return""+args[0]+" is not a valid expansion depth";}else{appender.setCommandLineObjectExpansionDepth(expansionDepth);return"Object expansion depth set to "+expansionDepth;}});}\r
+function init(){createCommandLineFunctions();}\r
+init();})();log4javascript.setDocumentReady=function(){pageLoaded=true;log4javascript.dispatchEvent("load",{});};if(window.addEventListener){window.addEventListener("load",log4javascript.setDocumentReady,false);}else if(window.attachEvent){window.attachEvent("onload",log4javascript.setDocumentReady);}else{var oldOnload=window.onload;if(typeof window.onload!="function"){window.onload=log4javascript.setDocumentReady;}else{window.onload=function(evt){if(oldOnload){oldOnload(evt);}\r
+log4javascript.setDocumentReady();};}}\r
+window.log4javascript=log4javascript;return log4javascript;})();\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/log4javascript_uncompressed.js b/planetstack/core/static/log4javascript-1.4.6/log4javascript_uncompressed.js
new file mode 100644 (file)
index 0000000..a644e3b
--- /dev/null
@@ -0,0 +1,5879 @@
+/**\r
+ * Copyright 2013 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+/**\r
+ * log4javascript\r
+ *\r
+ * log4javascript is a logging framework for JavaScript based on log4j\r
+ * for Java. This file contains all core log4javascript code and is the only\r
+ * file required to use log4javascript, unless you require support for\r
+ * document.domain, in which case you will also need console.html, which must be\r
+ * stored in the same directory as the main log4javascript.js file.\r
+ *\r
+ * Author: Tim Down <tim@log4javascript.org>\r
+ * Version: 1.4.6\r
+ * Edition: log4javascript\r
+ * Build date: 19 March 2013\r
+ * Website: http://log4javascript.org\r
+ */\r
+\r
+/* -------------------------------------------------------------------------- */\r
+// Array-related stuff\r
+\r
+// Next three methods are solely for IE5, which is missing them\r
+if (!Array.prototype.push) {\r
+       Array.prototype.push = function() {\r
+               for (var i = 0, len = arguments.length; i < len; i++){\r
+                       this[this.length] = arguments[i];\r
+               }\r
+               return this.length;\r
+       };\r
+}\r
+\r
+if (!Array.prototype.shift) {\r
+       Array.prototype.shift = function() {\r
+               if (this.length > 0) {\r
+                       var firstItem = this[0];\r
+                       for (var i = 0, len = this.length - 1; i < len; i++) {\r
+                               this[i] = this[i + 1];\r
+                       }\r
+                       this.length = this.length - 1;\r
+                       return firstItem;\r
+               }\r
+       };\r
+}\r
+\r
+if (!Array.prototype.splice) {\r
+       Array.prototype.splice = function(startIndex, deleteCount) {\r
+               var itemsAfterDeleted = this.slice(startIndex + deleteCount);\r
+               var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);\r
+               this.length = startIndex;\r
+               // Copy the arguments into a proper Array object\r
+               var argumentsArray = [];\r
+               for (var i = 0, len = arguments.length; i < len; i++) {\r
+                       argumentsArray[i] = arguments[i];\r
+               }\r
+               var itemsToAppend = (argumentsArray.length > 2) ?\r
+                       itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;\r
+               for (i = 0, len = itemsToAppend.length; i < len; i++) {\r
+                       this.push(itemsToAppend[i]);\r
+               }\r
+               return itemsDeleted;\r
+       };\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+var log4javascript = (function() {\r
+\r
+       function isUndefined(obj) {\r
+               return typeof obj == "undefined";\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Custom event support\r
+\r
+       function EventSupport() {}\r
+\r
+       EventSupport.prototype = {\r
+               eventTypes: [],\r
+               eventListeners: {},\r
+               setEventTypes: function(eventTypesParam) {\r
+                       if (eventTypesParam instanceof Array) {\r
+                               this.eventTypes = eventTypesParam;\r
+                               this.eventListeners = {};\r
+                               for (var i = 0, len = this.eventTypes.length; i < len; i++) {\r
+                                       this.eventListeners[this.eventTypes[i]] = [];\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: setEventTypes: eventTypes parameter must be an Array");\r
+                       }\r
+               },\r
+\r
+               addEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: addEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               this.eventListeners[eventType].push(listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: addEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               removeEventListener: function(eventType, listener) {\r
+                       if (typeof listener == "function") {\r
+                               if (!array_contains(this.eventTypes, eventType)) {\r
+                                       handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: no event called '" + eventType + "'");\r
+                               }\r
+                               array_remove(this.eventListeners[eventType], listener);\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: removeEventListener: listener must be a function");\r
+                       }\r
+               },\r
+\r
+               dispatchEvent: function(eventType, eventArgs) {\r
+                       if (array_contains(this.eventTypes, eventType)) {\r
+                               var listeners = this.eventListeners[eventType];\r
+                               for (var i = 0, len = listeners.length; i < len; i++) {\r
+                                       listeners[i](this, eventType, eventArgs);\r
+                               }\r
+                       } else {\r
+                               handleError("log4javascript.EventSupport [" + this + "]: dispatchEvent: no event called '" + eventType + "'");\r
+                       }\r
+               }\r
+       };\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+\r
+       var applicationStartDate = new Date();\r
+       var uniqueId = "log4javascript_" + applicationStartDate.getTime() + "_" +\r
+               Math.floor(Math.random() * 100000000);\r
+       var emptyFunction = function() {};\r
+       var newLine = "\r\n";\r
+       var pageLoaded = false;\r
+\r
+       // Create main log4javascript object; this will be assigned public properties\r
+       function Log4JavaScript() {}\r
+       Log4JavaScript.prototype = new EventSupport();\r
+\r
+       log4javascript = new Log4JavaScript();\r
+       log4javascript.version = "1.4.6";\r
+       log4javascript.edition = "log4javascript";\r
+\r
+       /* -------------------------------------------------------------------------- */\r
+       // Utility functions\r
+\r
+       function toStr(obj) {\r
+               if (obj && obj.toString) {\r
+                       return obj.toString();\r
+               } else {\r
+                       return String(obj);\r
+               }\r
+       }\r
+\r
+       function getExceptionMessage(ex) {\r
+               if (ex.message) {\r
+                       return ex.message;\r
+               } else if (ex.description) {\r
+                       return ex.description;\r
+               } else {\r
+                       return toStr(ex);\r
+               }\r
+       }\r
+\r
+       // Gets the portion of the URL after the last slash\r
+       function getUrlFileName(url) {\r
+               var lastSlashIndex = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));\r
+               return url.substr(lastSlashIndex + 1);\r
+       }\r
+\r
+       // Returns a nicely formatted representation of an error\r
+       function getExceptionStringRep(ex) {\r
+               if (ex) {\r
+                       var exStr = "Exception: " + getExceptionMessage(ex);\r
+                       try {\r
+                               if (ex.lineNumber) {\r
+                                       exStr += " on line number " + ex.lineNumber;\r
+                               }\r
+                               if (ex.fileName) {\r
+                                       exStr += " in file " + getUrlFileName(ex.fileName);\r
+                               }\r
+                       } catch (localEx) {\r
+                               logLog.warn("Unable to obtain file and line information for error");\r
+                       }\r
+                       if (showStackTraces && ex.stack) {\r
+                               exStr += newLine + "Stack trace:" + newLine + ex.stack;\r
+                       }\r
+                       return exStr;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       function bool(obj) {\r
+               return Boolean(obj);\r
+       }\r
+\r
+       function trim(str) {\r
+               return str.replace(/^\s+/, "").replace(/\s+$/, "");\r
+       }\r
+\r
+       function splitIntoLines(text) {\r
+               // Ensure all line breaks are \n only\r
+               var text2 = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");\r
+               return text2.split("\n");\r
+       }\r
+\r
+       var urlEncode = (typeof window.encodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return encodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");\r
+               };\r
+\r
+       var urlDecode = (typeof window.decodeURIComponent != "undefined") ?\r
+               function(str) {\r
+                       return decodeURIComponent(str);\r
+               }: \r
+               function(str) {\r
+                       return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");\r
+               };\r
+\r
+       function array_remove(arr, val) {\r
+               var index = -1;\r
+               for (var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] === val) {\r
+                               index = i;\r
+                               break;\r
+                       }\r
+               }\r
+               if (index >= 0) {\r
+                       arr.splice(index, 1);\r
+                       return true;\r
+               } else {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       function array_contains(arr, val) {\r
+               for(var i = 0, len = arr.length; i < len; i++) {\r
+                       if (arr[i] == val) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+       function extractBooleanFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return bool(param);\r
+               }\r
+       }\r
+\r
+       function extractStringFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       return String(param);\r
+               }\r
+       }\r
+\r
+       function extractIntFromParam(param, defaultValue) {\r
+               if (isUndefined(param)) {\r
+                       return defaultValue;\r
+               } else {\r
+                       try {\r
+                               var value = parseInt(param, 10);\r
+                               return isNaN(value) ? defaultValue : value;\r
+                       } catch (ex) {\r
+                               logLog.warn("Invalid int param " + param, ex);\r
+                               return defaultValue;\r
+                       }\r
+               }\r
+       }\r
+\r
+       function extractFunctionFromParam(param, defaultValue) {\r
+               if (typeof param == "function") {\r
+                       return param;\r
+               } else {\r
+                       return defaultValue;\r
+               }\r
+       }\r
+\r
+       function isError(err) {\r
+               return (err instanceof Error);\r
+       }\r
+\r
+       if (!Function.prototype.apply){\r
+               Function.prototype.apply = function(obj, args) {\r
+                       var methodName = "__apply__";\r
+                       if (typeof obj[methodName] != "undefined") {\r
+                               methodName += String(Math.random()).substr(2);\r
+                       }\r
+                       obj[methodName] = this;\r
+\r
+                       var argsStrings = [];\r
+                       for (var i = 0, len = args.length; i < len; i++) {\r
+                               argsStrings[i] = "args[" + i + "]";\r
+                       }\r
+                       var script = "obj." + methodName + "(" + argsStrings.join(",") + ")";\r
+                       var returnValue = eval(script);\r
+                       delete obj[methodName];\r
+                       return returnValue;\r
+               };\r
+       }\r
+\r
+       if (!Function.prototype.call){\r
+               Function.prototype.call = function(obj) {\r
+                       var args = [];\r
+                       for (var i = 1, len = arguments.length; i < len; i++) {\r
+                               args[i - 1] = arguments[i];\r
+                       }\r
+                       return this.apply(obj, args);\r
+               };\r
+       }\r
+\r
+       function getListenersPropertyName(eventName) {\r
+               return "__log4javascript_listeners__" + eventName;\r
+       }\r
+\r
+       function addEvent(node, eventName, listener, useCapture, win) {\r
+               win = win ? win : window;\r
+               if (node.addEventListener) {\r
+                       node.addEventListener(eventName, listener, useCapture);\r
+               } else if (node.attachEvent) {\r
+                       node.attachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (!node[propertyName]) {\r
+                               node[propertyName] = [];\r
+                               // Set event handler\r
+                               node["on" + eventName] = function(evt) {\r
+                                       evt = getEvent(evt, win);\r
+                                       var listenersPropertyName = getListenersPropertyName(eventName);\r
+\r
+                                       // Clone the array of listeners to leave the original untouched\r
+                                       var listeners = this[listenersPropertyName].concat([]);\r
+                                       var currentListener;\r
+\r
+                                       // Call each listener in turn\r
+                                       while ((currentListener = listeners.shift())) {\r
+                                               currentListener.call(this, evt);\r
+                                       }\r
+                               };\r
+                       }\r
+                       node[propertyName].push(listener);\r
+               }\r
+       }\r
+\r
+       function removeEvent(node, eventName, listener, useCapture) {\r
+               if (node.removeEventListener) {\r
+                       node.removeEventListener(eventName, listener, useCapture);\r
+               } else if (node.detachEvent) {\r
+                       node.detachEvent("on" + eventName, listener);\r
+               } else {\r
+                       var propertyName = getListenersPropertyName(eventName);\r
+                       if (node[propertyName]) {\r
+                               array_remove(node[propertyName], listener);\r
+                       }\r
+               }\r
+       }\r
+\r
+       function getEvent(evt, win) {\r
+               win = win ? win : window;\r
+               return evt ? evt : win.event;\r
+       }\r
+\r
+       function stopEventPropagation(evt) {\r
+               if (evt.stopPropagation) {\r
+                       evt.stopPropagation();\r
+               } else if (typeof evt.cancelBubble != "undefined") {\r
+                       evt.cancelBubble = true;\r
+               }\r
+               evt.returnValue = false;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Simple logging for log4javascript itself\r
+\r
+       var logLog = {\r
+               quietMode: false,\r
+\r
+               debugMessages: [],\r
+\r
+               setQuietMode: function(quietMode) {\r
+                       this.quietMode = bool(quietMode);\r
+               },\r
+\r
+               numberOfErrors: 0,\r
+\r
+               alertAllErrors: false,\r
+\r
+               setAlertAllErrors: function(alertAllErrors) {\r
+                       this.alertAllErrors = alertAllErrors;\r
+               },\r
+\r
+               debug: function(message) {\r
+                       this.debugMessages.push(message);\r
+               },\r
+\r
+               displayDebug: function() {\r
+                       alert(this.debugMessages.join(newLine));\r
+               },\r
+\r
+               warn: function(message, exception) {\r
+               },\r
+\r
+               error: function(message, exception) {\r
+                       if (++this.numberOfErrors == 1 || this.alertAllErrors) {\r
+                               if (!this.quietMode) {\r
+                                       var alertMessage = "log4javascript error: " + message;\r
+                                       if (exception) {\r
+                                               alertMessage += newLine + newLine + "Original error: " + getExceptionStringRep(exception);\r
+                                       }\r
+                                       alert(alertMessage);\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+       log4javascript.logLog = logLog;\r
+\r
+       log4javascript.setEventTypes(["load", "error"]);\r
+\r
+       function handleError(message, exception) {\r
+               logLog.error(message, exception);\r
+               log4javascript.dispatchEvent("error", { "message": message, "exception": exception });\r
+       }\r
+\r
+       log4javascript.handleError = handleError;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+\r
+       var enabled = !((typeof log4javascript_disabled != "undefined") &&\r
+                                       log4javascript_disabled);\r
+\r
+       log4javascript.setEnabled = function(enable) {\r
+               enabled = bool(enable);\r
+       };\r
+\r
+       log4javascript.isEnabled = function() {\r
+               return enabled;\r
+       };\r
+\r
+       var useTimeStampsInMilliseconds = true;\r
+\r
+       log4javascript.setTimeStampsInMilliseconds = function(timeStampsInMilliseconds) {\r
+               useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+       };\r
+\r
+       log4javascript.isTimeStampsInMilliseconds = function() {\r
+               return useTimeStampsInMilliseconds;\r
+       };\r
+       \r
+\r
+       // This evaluates the given expression in the current scope, thus allowing\r
+       // scripts to access private variables. Particularly useful for testing\r
+       log4javascript.evalInScope = function(expr) {\r
+               return eval(expr);\r
+       };\r
+\r
+       var showStackTraces = false;\r
+\r
+       log4javascript.setShowStackTraces = function(show) {\r
+               showStackTraces = bool(show);\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Levels\r
+\r
+       var Level = function(level, name) {\r
+               this.level = level;\r
+               this.name = name;\r
+       };\r
+\r
+       Level.prototype = {\r
+               toString: function() {\r
+                       return this.name;\r
+               },\r
+               equals: function(level) {\r
+                       return this.level == level.level;\r
+               },\r
+               isGreaterOrEqual: function(level) {\r
+                       return this.level >= level.level;\r
+               }\r
+       };\r
+\r
+       Level.ALL = new Level(Number.MIN_VALUE, "ALL");\r
+       Level.TRACE = new Level(10000, "TRACE");\r
+       Level.DEBUG = new Level(20000, "DEBUG");\r
+       Level.INFO = new Level(30000, "INFO");\r
+       Level.WARN = new Level(40000, "WARN");\r
+       Level.ERROR = new Level(50000, "ERROR");\r
+       Level.FATAL = new Level(60000, "FATAL");\r
+       Level.OFF = new Level(Number.MAX_VALUE, "OFF");\r
+\r
+       log4javascript.Level = Level;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Timers\r
+\r
+       function Timer(name, level) {\r
+               this.name = name;\r
+               this.level = isUndefined(level) ? Level.INFO : level;\r
+               this.start = new Date();\r
+       }\r
+\r
+       Timer.prototype.getElapsedTime = function() {\r
+               return new Date().getTime() - this.start.getTime();\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Loggers\r
+\r
+       var anonymousLoggerName = "[anonymous]";\r
+       var defaultLoggerName = "[default]";\r
+       var nullLoggerName = "[null]";\r
+       var rootLoggerName = "root";\r
+\r
+       function Logger(name) {\r
+               this.name = name;\r
+               this.parent = null;\r
+               this.children = [];\r
+\r
+               var appenders = [];\r
+               var loggerLevel = null;\r
+               var isRoot = (this.name === rootLoggerName);\r
+               var isNull = (this.name === nullLoggerName);\r
+\r
+               var appenderCache = null;\r
+               var appenderCacheInvalidated = false;\r
+               \r
+               this.addChild = function(childLogger) {\r
+                       this.children.push(childLogger);\r
+                       childLogger.parent = this;\r
+                       childLogger.invalidateAppenderCache();\r
+               };\r
+\r
+               // Additivity\r
+               var additive = true;\r
+               this.getAdditivity = function() {\r
+                       return additive;\r
+               };\r
+\r
+               this.setAdditivity = function(additivity) {\r
+                       var valueChanged = (additive != additivity);\r
+                       additive = additivity;\r
+                       if (valueChanged) {\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               // Create methods that use the appenders variable in this scope\r
+               this.addAppender = function(appender) {\r
+                       if (isNull) {\r
+                               handleError("Logger.addAppender: you may not add an appender to the null logger");\r
+                       } else {\r
+                               if (appender instanceof log4javascript.Appender) {\r
+                                       if (!array_contains(appenders, appender)) {\r
+                                               appenders.push(appender);\r
+                                               appender.setAddedToLogger(this);\r
+                                               this.invalidateAppenderCache();\r
+                                       }\r
+                               } else {\r
+                                       handleError("Logger.addAppender: appender supplied ('" +\r
+                                               toStr(appender) + "') is not a subclass of Appender");\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.removeAppender = function(appender) {\r
+                       array_remove(appenders, appender);\r
+                       appender.setRemovedFromLogger(this);\r
+                       this.invalidateAppenderCache();\r
+               };\r
+\r
+               this.removeAllAppenders = function() {\r
+                       var appenderCount = appenders.length;\r
+                       if (appenderCount > 0) {\r
+                               for (var i = 0; i < appenderCount; i++) {\r
+                                       appenders[i].setRemovedFromLogger(this);\r
+                               }\r
+                               appenders.length = 0;\r
+                               this.invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.getEffectiveAppenders = function() {\r
+                       if (appenderCache === null || appenderCacheInvalidated) {\r
+                               // Build appender cache\r
+                               var parentEffectiveAppenders = (isRoot || !this.getAdditivity()) ?\r
+                                       [] : this.parent.getEffectiveAppenders();\r
+                               appenderCache = parentEffectiveAppenders.concat(appenders);\r
+                               appenderCacheInvalidated = false;\r
+                       }\r
+                       return appenderCache;\r
+               };\r
+               \r
+               this.invalidateAppenderCache = function() {\r
+                       appenderCacheInvalidated = true;\r
+                       for (var i = 0, len = this.children.length; i < len; i++) {\r
+                               this.children[i].invalidateAppenderCache();\r
+                       }\r
+               };\r
+\r
+               this.log = function(level, params) {\r
+                       if (enabled && level.isGreaterOrEqual(this.getEffectiveLevel())) {\r
+                               // Check whether last param is an exception\r
+                               var exception;\r
+                               var finalParamIndex = params.length - 1;\r
+                               var lastParam = params[finalParamIndex];\r
+                               if (params.length > 1 && isError(lastParam)) {\r
+                                       exception = lastParam;\r
+                                       finalParamIndex--;\r
+                               }\r
+\r
+                               // Construct genuine array for the params\r
+                               var messages = [];\r
+                               for (var i = 0; i <= finalParamIndex; i++) {\r
+                                       messages[i] = params[i];\r
+                               }\r
+\r
+                               var loggingEvent = new LoggingEvent(\r
+                                       this, new Date(), level, messages, exception);\r
+\r
+                               this.callAppenders(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.callAppenders = function(loggingEvent) {\r
+                       var effectiveAppenders = this.getEffectiveAppenders();\r
+                       for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                               effectiveAppenders[i].doAppend(loggingEvent);\r
+                       }\r
+               };\r
+\r
+               this.setLevel = function(level) {\r
+                       // Having a level of null on the root logger would be very bad.\r
+                       if (isRoot && level === null) {\r
+                               handleError("Logger.setLevel: you cannot set the level of the root logger to null");\r
+                       } else if (level instanceof Level) {\r
+                               loggerLevel = level;\r
+                       } else {\r
+                               handleError("Logger.setLevel: level supplied to logger " +\r
+                                       this.name + " is not an instance of log4javascript.Level");\r
+                       }\r
+               };\r
+\r
+               this.getLevel = function() {\r
+                       return loggerLevel;\r
+               };\r
+\r
+               this.getEffectiveLevel = function() {\r
+                       for (var logger = this; logger !== null; logger = logger.parent) {\r
+                               var level = logger.getLevel();\r
+                               if (level !== null) {\r
+                                       return level;\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.group = function(name, initiallyExpanded) {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].group(name, initiallyExpanded);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.groupEnd = function() {\r
+                       if (enabled) {\r
+                               var effectiveAppenders = this.getEffectiveAppenders();\r
+                               for (var i = 0, len = effectiveAppenders.length; i < len; i++) {\r
+                                       effectiveAppenders[i].groupEnd();\r
+                               }\r
+                       }\r
+               };\r
+\r
+               var timers = {};\r
+\r
+               this.time = function(name, level) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.time: a name for the timer must be supplied");\r
+                               } else if (level && !(level instanceof Level)) {\r
+                                       handleError("Logger.time: level supplied to timer " +\r
+                                               name + " is not an instance of log4javascript.Level");\r
+                               } else {\r
+                                       timers[name] = new Timer(name, level);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.timeEnd = function(name) {\r
+                       if (enabled) {\r
+                               if (isUndefined(name)) {\r
+                                       handleError("Logger.timeEnd: a name for the timer must be supplied");\r
+                               } else if (timers[name]) {\r
+                                       var timer = timers[name];\r
+                                       var milliseconds = timer.getElapsedTime();\r
+                                       this.log(timer.level, ["Timer " + toStr(name) + " completed in " + milliseconds + "ms"]);\r
+                                       delete timers[name];\r
+                               } else {\r
+                                       logLog.warn("Logger.timeEnd: no timer found with name " + name);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.assert = function(expr) {\r
+                       if (enabled && !expr) {\r
+                               var args = [];\r
+                               for (var i = 1, len = arguments.length; i < len; i++) {\r
+                                       args.push(arguments[i]);\r
+                               }\r
+                               args = (args.length > 0) ? args : ["Assertion Failure"];\r
+                               args.push(newLine);\r
+                               args.push(expr);\r
+                               this.log(Level.ERROR, args);\r
+                       }\r
+               };\r
+\r
+               this.toString = function() {\r
+                       return "Logger[" + this.name + "]";\r
+               };\r
+       }\r
+\r
+       Logger.prototype = {\r
+               trace: function() {\r
+                       this.log(Level.TRACE, arguments);\r
+               },\r
+\r
+               debug: function() {\r
+                       this.log(Level.DEBUG, arguments);\r
+               },\r
+\r
+               info: function() {\r
+                       this.log(Level.INFO, arguments);\r
+               },\r
+\r
+               warn: function() {\r
+                       this.log(Level.WARN, arguments);\r
+               },\r
+\r
+               error: function() {\r
+                       this.log(Level.ERROR, arguments);\r
+               },\r
+\r
+               fatal: function() {\r
+                       this.log(Level.FATAL, arguments);\r
+               },\r
+\r
+               isEnabledFor: function(level) {\r
+                       return level.isGreaterOrEqual(this.getEffectiveLevel());\r
+               },\r
+\r
+               isTraceEnabled: function() {\r
+                       return this.isEnabledFor(Level.TRACE);\r
+               },\r
+\r
+               isDebugEnabled: function() {\r
+                       return this.isEnabledFor(Level.DEBUG);\r
+               },\r
+\r
+               isInfoEnabled: function() {\r
+                       return this.isEnabledFor(Level.INFO);\r
+               },\r
+\r
+               isWarnEnabled: function() {\r
+                       return this.isEnabledFor(Level.WARN);\r
+               },\r
+\r
+               isErrorEnabled: function() {\r
+                       return this.isEnabledFor(Level.ERROR);\r
+               },\r
+\r
+               isFatalEnabled: function() {\r
+                       return this.isEnabledFor(Level.FATAL);\r
+               }\r
+       };\r
+\r
+       Logger.prototype.trace.isEntryPoint = true;\r
+       Logger.prototype.debug.isEntryPoint = true;\r
+       Logger.prototype.info.isEntryPoint = true;\r
+       Logger.prototype.warn.isEntryPoint = true;\r
+       Logger.prototype.error.isEntryPoint = true;\r
+       Logger.prototype.fatal.isEntryPoint = true;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logger access methods\r
+\r
+       // Hashtable of loggers keyed by logger name\r
+       var loggers = {};\r
+       var loggerNames = [];\r
+\r
+       var ROOT_LOGGER_DEFAULT_LEVEL = Level.DEBUG;\r
+       var rootLogger = new Logger(rootLoggerName);\r
+       rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+\r
+       log4javascript.getRootLogger = function() {\r
+               return rootLogger;\r
+       };\r
+\r
+       log4javascript.getLogger = function(loggerName) {\r
+               // Use default logger if loggerName is not specified or invalid\r
+               if (!(typeof loggerName == "string")) {\r
+                       loggerName = anonymousLoggerName;\r
+                       logLog.warn("log4javascript.getLogger: non-string logger name " +\r
+                               toStr(loggerName) + " supplied, returning anonymous logger");\r
+               }\r
+\r
+               // Do not allow retrieval of the root logger by name\r
+               if (loggerName == rootLoggerName) {\r
+                       handleError("log4javascript.getLogger: root logger may not be obtained by name");\r
+               }\r
+\r
+               // Create the logger for this name if it doesn't already exist\r
+               if (!loggers[loggerName]) {\r
+                       var logger = new Logger(loggerName);\r
+                       loggers[loggerName] = logger;\r
+                       loggerNames.push(loggerName);\r
+\r
+                       // Set up parent logger, if it doesn't exist\r
+                       var lastDotIndex = loggerName.lastIndexOf(".");\r
+                       var parentLogger;\r
+                       if (lastDotIndex > -1) {\r
+                               var parentLoggerName = loggerName.substring(0, lastDotIndex);\r
+                               parentLogger = log4javascript.getLogger(parentLoggerName); // Recursively sets up grandparents etc.\r
+                       } else {\r
+                               parentLogger = rootLogger;\r
+                       }\r
+                       parentLogger.addChild(logger);\r
+               }\r
+               return loggers[loggerName];\r
+       };\r
+\r
+       var defaultLogger = null;\r
+       log4javascript.getDefaultLogger = function() {\r
+               if (!defaultLogger) {\r
+                       defaultLogger = log4javascript.getLogger(defaultLoggerName);\r
+                       var a = new log4javascript.PopUpAppender();\r
+                       defaultLogger.addAppender(a);\r
+               }\r
+               return defaultLogger;\r
+       };\r
+\r
+       var nullLogger = null;\r
+       log4javascript.getNullLogger = function() {\r
+               if (!nullLogger) {\r
+                       nullLogger = new Logger(nullLoggerName);\r
+                       nullLogger.setLevel(Level.OFF);\r
+               }\r
+               return nullLogger;\r
+       };\r
+\r
+       // Destroys all loggers\r
+       log4javascript.resetConfiguration = function() {\r
+               rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);\r
+               loggers = {};\r
+       };\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Logging events\r
+\r
+       var LoggingEvent = function(logger, timeStamp, level, messages,\r
+                       exception) {\r
+               this.logger = logger;\r
+               this.timeStamp = timeStamp;\r
+               this.timeStampInMilliseconds = timeStamp.getTime();\r
+               this.timeStampInSeconds = Math.floor(this.timeStampInMilliseconds / 1000);\r
+               this.milliseconds = this.timeStamp.getMilliseconds();\r
+               this.level = level;\r
+               this.messages = messages;\r
+               this.exception = exception;\r
+       };\r
+\r
+       LoggingEvent.prototype = {\r
+               getThrowableStrRep: function() {\r
+                       return this.exception ?\r
+                               getExceptionStringRep(this.exception) : "";\r
+               },\r
+               getCombinedMessages: function() {\r
+                       return (this.messages.length == 1) ? this.messages[0] :\r
+                                  this.messages.join(newLine);\r
+               },\r
+               toString: function() {\r
+                       return "LoggingEvent[" + this.level + "]";\r
+               }\r
+       };\r
+\r
+       log4javascript.LoggingEvent = LoggingEvent;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Layout prototype\r
+\r
+       var Layout = function() {\r
+       };\r
+\r
+       Layout.prototype = {\r
+               defaults: {\r
+                       loggerKey: "logger",\r
+                       timeStampKey: "timestamp",\r
+                       millisecondsKey: "milliseconds",\r
+                       levelKey: "level",\r
+                       messageKey: "message",\r
+                       exceptionKey: "exception",\r
+                       urlKey: "url"\r
+               },\r
+               loggerKey: "logger",\r
+               timeStampKey: "timestamp",\r
+               millisecondsKey: "milliseconds",\r
+               levelKey: "level",\r
+               messageKey: "message",\r
+               exceptionKey: "exception",\r
+               urlKey: "url",\r
+               batchHeader: "",\r
+               batchFooter: "",\r
+               batchSeparator: "",\r
+               returnsPostData: false,\r
+               overrideTimeStampsSetting: false,\r
+               useTimeStampsInMilliseconds: null,\r
+\r
+               format: function() {\r
+                       handleError("Layout.format: layout supplied has no format() method");\r
+               },\r
+\r
+               ignoresThrowable: function() {\r
+                       handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");\r
+               },\r
+\r
+               getContentType: function() {\r
+                       return "text/plain";\r
+               },\r
+\r
+               allowBatching: function() {\r
+                       return true;\r
+               },\r
+\r
+               setTimeStampsInMilliseconds: function(timeStampsInMilliseconds) {\r
+                       this.overrideTimeStampsSetting = true;\r
+                       this.useTimeStampsInMilliseconds = bool(timeStampsInMilliseconds);\r
+               },\r
+\r
+               isTimeStampsInMilliseconds: function() {\r
+                       return this.overrideTimeStampsSetting ?\r
+                               this.useTimeStampsInMilliseconds : useTimeStampsInMilliseconds;\r
+               },\r
+\r
+               getTimeStampValue: function(loggingEvent) {\r
+                       return this.isTimeStampsInMilliseconds() ?\r
+                               loggingEvent.timeStampInMilliseconds : loggingEvent.timeStampInSeconds;\r
+               },\r
+\r
+               getDataValues: function(loggingEvent, combineMessages) {\r
+                       var dataValues = [\r
+                               [this.loggerKey, loggingEvent.logger.name],\r
+                               [this.timeStampKey, this.getTimeStampValue(loggingEvent)],\r
+                               [this.levelKey, loggingEvent.level.name],\r
+                               [this.urlKey, window.location.href],\r
+                               [this.messageKey, combineMessages ? loggingEvent.getCombinedMessages() : loggingEvent.messages]\r
+                       ];\r
+                       if (!this.isTimeStampsInMilliseconds()) {\r
+                               dataValues.push([this.millisecondsKey, loggingEvent.milliseconds]);\r
+                       }\r
+                       if (loggingEvent.exception) {\r
+                               dataValues.push([this.exceptionKey, getExceptionStringRep(loggingEvent.exception)]);\r
+                       }\r
+                       if (this.hasCustomFields()) {\r
+                               for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                                       var val = this.customFields[i].value;\r
+\r
+                                       // Check if the value is a function. If so, execute it, passing it the\r
+                                       // current layout and the logging event\r
+                                       if (typeof val === "function") {\r
+                                               val = val(this, loggingEvent);\r
+                                       }\r
+                                       dataValues.push([this.customFields[i].name, val]);\r
+                               }\r
+                       }\r
+                       return dataValues;\r
+               },\r
+\r
+               setKeys: function(loggerKey, timeStampKey, levelKey, messageKey,\r
+                               exceptionKey, urlKey, millisecondsKey) {\r
+                       this.loggerKey = extractStringFromParam(loggerKey, this.defaults.loggerKey);\r
+                       this.timeStampKey = extractStringFromParam(timeStampKey, this.defaults.timeStampKey);\r
+                       this.levelKey = extractStringFromParam(levelKey, this.defaults.levelKey);\r
+                       this.messageKey = extractStringFromParam(messageKey, this.defaults.messageKey);\r
+                       this.exceptionKey = extractStringFromParam(exceptionKey, this.defaults.exceptionKey);\r
+                       this.urlKey = extractStringFromParam(urlKey, this.defaults.urlKey);\r
+                       this.millisecondsKey = extractStringFromParam(millisecondsKey, this.defaults.millisecondsKey);\r
+               },\r
+\r
+               setCustomField: function(name, value) {\r
+                       var fieldUpdated = false;\r
+                       for (var i = 0, len = this.customFields.length; i < len; i++) {\r
+                               if (this.customFields[i].name === name) {\r
+                                       this.customFields[i].value = value;\r
+                                       fieldUpdated = true;\r
+                               }\r
+                       }\r
+                       if (!fieldUpdated) {\r
+                               this.customFields.push({"name": name, "value": value});\r
+                       }\r
+               },\r
+\r
+               hasCustomFields: function() {\r
+                       return (this.customFields.length > 0);\r
+               },\r
+\r
+               toString: function() {\r
+                       handleError("Layout.toString: all layouts must override this method");\r
+               }\r
+       };\r
+\r
+       log4javascript.Layout = Layout;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Appender prototype\r
+\r
+       var Appender = function() {};\r
+\r
+       Appender.prototype = new EventSupport();\r
+\r
+       Appender.prototype.layout = new PatternLayout();\r
+       Appender.prototype.threshold = Level.ALL;\r
+       Appender.prototype.loggers = [];\r
+\r
+       // Performs threshold checks before delegating actual logging to the\r
+       // subclass's specific append method.\r
+       Appender.prototype.doAppend = function(loggingEvent) {\r
+               if (enabled && loggingEvent.level.level >= this.threshold.level) {\r
+                       this.append(loggingEvent);\r
+               }\r
+       };\r
+\r
+       Appender.prototype.append = function(loggingEvent) {};\r
+\r
+       Appender.prototype.setLayout = function(layout) {\r
+               if (layout instanceof Layout) {\r
+                       this.layout = layout;\r
+               } else {\r
+                       handleError("Appender.setLayout: layout supplied to " +\r
+                               this.toString() + " is not a subclass of Layout");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getLayout = function() {\r
+               return this.layout;\r
+       };\r
+\r
+       Appender.prototype.setThreshold = function(threshold) {\r
+               if (threshold instanceof Level) {\r
+                       this.threshold = threshold;\r
+               } else {\r
+                       handleError("Appender.setThreshold: threshold supplied to " +\r
+                               this.toString() + " is not a subclass of Level");\r
+               }\r
+       };\r
+\r
+       Appender.prototype.getThreshold = function() {\r
+               return this.threshold;\r
+       };\r
+\r
+       Appender.prototype.setAddedToLogger = function(logger) {\r
+               this.loggers.push(logger);\r
+       };\r
+\r
+       Appender.prototype.setRemovedFromLogger = function(logger) {\r
+               array_remove(this.loggers, logger);\r
+       };\r
+\r
+       Appender.prototype.group = emptyFunction;\r
+       Appender.prototype.groupEnd = emptyFunction;\r
+\r
+       Appender.prototype.toString = function() {\r
+               handleError("Appender.toString: all appenders must override this method");\r
+       };\r
+\r
+       log4javascript.Appender = Appender;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // SimpleLayout \r
+\r
+       function SimpleLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       SimpleLayout.prototype = new Layout();\r
+\r
+       SimpleLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.level.name + " - " + loggingEvent.getCombinedMessages();\r
+       };\r
+\r
+       SimpleLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       SimpleLayout.prototype.toString = function() {\r
+           return "SimpleLayout";\r
+       };\r
+\r
+       log4javascript.SimpleLayout = SimpleLayout;\r
+       /* ----------------------------------------------------------------------- */\r
+       // NullLayout \r
+\r
+       function NullLayout() {\r
+               this.customFields = [];\r
+       }\r
+\r
+       NullLayout.prototype = new Layout();\r
+\r
+       NullLayout.prototype.format = function(loggingEvent) {\r
+               return loggingEvent.messages;\r
+       };\r
+\r
+       NullLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       NullLayout.prototype.toString = function() {\r
+           return "NullLayout";\r
+       };\r
+\r
+       log4javascript.NullLayout = NullLayout;\r
+/* ---------------------------------------------------------------------- */\r
+       // XmlLayout\r
+\r
+       function XmlLayout(combineMessages) {\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.customFields = [];\r
+       }\r
+\r
+       XmlLayout.prototype = new Layout();\r
+\r
+       XmlLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+       XmlLayout.prototype.getContentType = function() {\r
+               return "text/xml";\r
+       };\r
+\r
+       XmlLayout.prototype.escapeCdata = function(str) {\r
+               return str.replace(/\]\]>/, "]]>]]&gt;<![CDATA[");\r
+       };\r
+\r
+       XmlLayout.prototype.format = function(loggingEvent) {\r
+               var layout = this;\r
+               var i, len;\r
+               function formatMessage(message) {\r
+                       message = (typeof message === "string") ? message : toStr(message);\r
+                       return "<log4javascript:message><![CDATA[" +\r
+                               layout.escapeCdata(message) + "]]></log4javascript:message>";\r
+               }\r
+\r
+               var str = "<log4javascript:event logger=\"" + loggingEvent.logger.name +\r
+                       "\" timestamp=\"" + this.getTimeStampValue(loggingEvent) + "\"";\r
+               if (!this.isTimeStampsInMilliseconds()) {\r
+                       str += " milliseconds=\"" + loggingEvent.milliseconds + "\"";\r
+               }\r
+               str += " level=\"" + loggingEvent.level.name + "\">" + newLine;\r
+               if (this.combineMessages) {\r
+                       str += formatMessage(loggingEvent.getCombinedMessages());\r
+               } else {\r
+                       str += "<log4javascript:messages>" + newLine;\r
+                       for (i = 0, len = loggingEvent.messages.length; i < len; i++) {\r
+                               str += formatMessage(loggingEvent.messages[i]) + newLine;\r
+                       }\r
+                       str += "</log4javascript:messages>" + newLine;\r
+               }\r
+               if (this.hasCustomFields()) {\r
+                       for (i = 0, len = this.customFields.length; i < len; i++) {\r
+                               str += "<log4javascript:customfield name=\"" +\r
+                                       this.customFields[i].name + "\"><![CDATA[" +\r
+                                       this.customFields[i].value.toString() +\r
+                                       "]]></log4javascript:customfield>" + newLine;\r
+                       }\r
+               }\r
+               if (loggingEvent.exception) {\r
+                       str += "<log4javascript:exception><![CDATA[" +\r
+                               getExceptionStringRep(loggingEvent.exception) +\r
+                               "]]></log4javascript:exception>" + newLine;\r
+               }\r
+               str += "</log4javascript:event>" + newLine + newLine;\r
+               return str;\r
+       };\r
+\r
+       XmlLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       XmlLayout.prototype.toString = function() {\r
+           return "XmlLayout";\r
+       };\r
+\r
+       log4javascript.XmlLayout = XmlLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout related\r
+\r
+       function escapeNewLines(str) {\r
+               return str.replace(/\r\n|\r|\n/g, "\\r\\n");\r
+       }\r
+\r
+       function JsonLayout(readable, combineMessages) {\r
+               this.readable = extractBooleanFromParam(readable, false);\r
+               this.combineMessages = extractBooleanFromParam(combineMessages, true);\r
+               this.batchHeader = this.readable ? "[" + newLine : "[";\r
+               this.batchFooter = this.readable ? "]" + newLine : "]";\r
+               this.batchSeparator = this.readable ? "," + newLine : ",";\r
+               this.setKeys();\r
+               this.colon = this.readable ? ": " : ":";\r
+               this.tab = this.readable ? "\t" : "";\r
+               this.lineBreak = this.readable ? newLine : "";\r
+               this.customFields = [];\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // JsonLayout\r
+\r
+       JsonLayout.prototype = new Layout();\r
+\r
+       JsonLayout.prototype.isReadable = function() {\r
+               return this.readable;\r
+       };\r
+\r
+       JsonLayout.prototype.isCombinedMessages = function() {\r
+               return this.combineMessages;\r
+       };\r
+\r
+    JsonLayout.prototype.format = function(loggingEvent) {\r
+        var layout = this;\r
+        var dataValues = this.getDataValues(loggingEvent, this.combineMessages);\r
+        var str = "{" + this.lineBreak;\r
+        var i, len;\r
+\r
+        function formatValue(val, prefix, expand) {\r
+            // Check the type of the data value to decide whether quotation marks\r
+            // or expansion are required\r
+            var formattedValue;\r
+            var valType = typeof val;\r
+            if (val instanceof Date) {\r
+                formattedValue = String(val.getTime());\r
+            } else if (expand && (val instanceof Array)) {\r
+                formattedValue = "[" + layout.lineBreak;\r
+                for (var i = 0, len = val.length; i < len; i++) {\r
+                    var childPrefix = prefix + layout.tab;\r
+                    formattedValue += childPrefix + formatValue(val[i], childPrefix, false);\r
+                    if (i < val.length - 1) {\r
+                        formattedValue += ",";\r
+                    }\r
+                    formattedValue += layout.lineBreak;\r
+                }\r
+                formattedValue += prefix + "]";\r
+            } else if (valType !== "number" && valType !== "boolean") {\r
+                formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";\r
+            } else {\r
+                formattedValue = val;\r
+            }\r
+            return formattedValue;\r
+        }\r
+\r
+        for (i = 0, len = dataValues.length - 1; i <= len; i++) {\r
+            str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);\r
+            if (i < len) {\r
+                str += ",";\r
+            }\r
+            str += this.lineBreak;\r
+        }\r
+\r
+        str += "}" + this.lineBreak;\r
+        return str;\r
+    };\r
+\r
+       JsonLayout.prototype.ignoresThrowable = function() {\r
+           return false;\r
+       };\r
+\r
+       JsonLayout.prototype.toString = function() {\r
+           return "JsonLayout";\r
+       };\r
+\r
+       JsonLayout.prototype.getContentType = function() {\r
+               return "application/json";\r
+       };\r
+\r
+       log4javascript.JsonLayout = JsonLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // HttpPostDataLayout\r
+\r
+       function HttpPostDataLayout() {\r
+               this.setKeys();\r
+               this.customFields = [];\r
+               this.returnsPostData = true;\r
+       }\r
+\r
+       HttpPostDataLayout.prototype = new Layout();\r
+\r
+       // Disable batching\r
+       HttpPostDataLayout.prototype.allowBatching = function() {\r
+               return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.format = function(loggingEvent) {\r
+               var dataValues = this.getDataValues(loggingEvent);\r
+               var queryBits = [];\r
+               for (var i = 0, len = dataValues.length; i < len; i++) {\r
+                       var val = (dataValues[i][1] instanceof Date) ?\r
+                               String(dataValues[i][1].getTime()) : dataValues[i][1];\r
+                       queryBits.push(urlEncode(dataValues[i][0]) + "=" + urlEncode(val));\r
+               }\r
+               return queryBits.join("&");\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {\r
+           return false;\r
+       };\r
+\r
+       HttpPostDataLayout.prototype.toString = function() {\r
+           return "HttpPostDataLayout";\r
+       };\r
+\r
+       log4javascript.HttpPostDataLayout = HttpPostDataLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // formatObjectExpansion\r
+\r
+       function formatObjectExpansion(obj, depth, indentation) {\r
+               var objectsExpanded = [];\r
+\r
+               function doFormat(obj, depth, indentation) {\r
+                       var i, j, len, childDepth, childIndentation, childLines, expansion,\r
+                               childExpansion;\r
+\r
+                       if (!indentation) {\r
+                               indentation = "";\r
+                       }\r
+\r
+                       function formatString(text) {\r
+                               var lines = splitIntoLines(text);\r
+                               for (var j = 1, jLen = lines.length; j < jLen; j++) {\r
+                                       lines[j] = indentation + lines[j];\r
+                               }\r
+                               return lines.join(newLine);\r
+                       }\r
+\r
+                       if (obj === null) {\r
+                               return "null";\r
+                       } else if (typeof obj == "undefined") {\r
+                               return "undefined";\r
+                       } else if (typeof obj == "string") {\r
+                               return formatString(obj);\r
+                       } else if (typeof obj == "object" && array_contains(objectsExpanded, obj)) {\r
+                               try {\r
+                                       expansion = toStr(obj);\r
+                               } catch (ex) {\r
+                                       expansion = "Error formatting property. Details: " + getExceptionStringRep(ex);\r
+                               }\r
+                               return expansion + " [already expanded]";\r
+                       } else if ((obj instanceof Array) && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "[" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i = 0, len = obj.length; i < len; i++) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + "Error formatting array member. Details: " +\r
+                                                       getExceptionStringRep(ex) + "");\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "]";\r
+                               return expansion;\r
+            } else if (Object.prototype.toString.call(obj) == "[object Date]") {\r
+                return obj.toString();\r
+                       } else if (typeof obj == "object" && depth > 0) {\r
+                               objectsExpanded.push(obj);\r
+                               expansion = "{" + newLine;\r
+                               childDepth = depth - 1;\r
+                               childIndentation = indentation + "  ";\r
+                               childLines = [];\r
+                               for (i in obj) {\r
+                                       try {\r
+                                               childExpansion = doFormat(obj[i], childDepth, childIndentation);\r
+                                               childLines.push(childIndentation + i + ": " + childExpansion);\r
+                                       } catch (ex) {\r
+                                               childLines.push(childIndentation + i + ": Error formatting property. Details: " +\r
+                                                       getExceptionStringRep(ex));\r
+                                       }\r
+                               }\r
+                               expansion += childLines.join("," + newLine) + newLine + indentation + "}";\r
+                               return expansion;\r
+                       } else {\r
+                               return formatString(toStr(obj));\r
+                       }\r
+               }\r
+               return doFormat(obj, depth, indentation);\r
+       }\r
+       /* ---------------------------------------------------------------------- */\r
+       // Date-related stuff\r
+\r
+       var SimpleDateFormat;\r
+\r
+       (function() {\r
+               var regex = /('[^']*')|(G+|y+|M+|w+|W+|D+|d+|F+|E+|a+|H+|k+|K+|h+|m+|s+|S+|Z+)|([a-zA-Z]+)|([^a-zA-Z']+)/;\r
+               var monthNames = ["January", "February", "March", "April", "May", "June",\r
+                       "July", "August", "September", "October", "November", "December"];\r
+               var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\r
+               var TEXT2 = 0, TEXT3 = 1, NUMBER = 2, YEAR = 3, MONTH = 4, TIMEZONE = 5;\r
+               var types = {\r
+                       G : TEXT2,\r
+                       y : YEAR,\r
+                       M : MONTH,\r
+                       w : NUMBER,\r
+                       W : NUMBER,\r
+                       D : NUMBER,\r
+                       d : NUMBER,\r
+                       F : NUMBER,\r
+                       E : TEXT3,\r
+                       a : TEXT2,\r
+                       H : NUMBER,\r
+                       k : NUMBER,\r
+                       K : NUMBER,\r
+                       h : NUMBER,\r
+                       m : NUMBER,\r
+                       s : NUMBER,\r
+                       S : NUMBER,\r
+                       Z : TIMEZONE\r
+               };\r
+               var ONE_DAY = 24 * 60 * 60 * 1000;\r
+               var ONE_WEEK = 7 * ONE_DAY;\r
+               var DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK = 1;\r
+\r
+               var newDateAtMidnight = function(year, month, day) {\r
+                       var d = new Date(year, month, day, 0, 0, 0);\r
+                       d.setMilliseconds(0);\r
+                       return d;\r
+               };\r
+\r
+               Date.prototype.getDifference = function(date) {\r
+                       return this.getTime() - date.getTime();\r
+               };\r
+\r
+               Date.prototype.isBefore = function(d) {\r
+                       return this.getTime() < d.getTime();\r
+               };\r
+\r
+               Date.prototype.getUTCTime = function() {\r
+                       return Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(),\r
+                                       this.getSeconds(), this.getMilliseconds());\r
+               };\r
+\r
+               Date.prototype.getTimeSince = function(d) {\r
+                       return this.getUTCTime() - d.getUTCTime();\r
+               };\r
+\r
+               Date.prototype.getPreviousSunday = function() {\r
+                       // Using midday avoids any possibility of DST messing things up\r
+                       var midday = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 12, 0, 0);\r
+                       var previousSunday = new Date(midday.getTime() - this.getDay() * ONE_DAY);\r
+                       return newDateAtMidnight(previousSunday.getFullYear(), previousSunday.getMonth(),\r
+                                       previousSunday.getDate());\r
+               };\r
+\r
+               Date.prototype.getWeekInYear = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfYear) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfYear) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfYear.getDay();\r
+                       var weekInYear = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek < minimalDaysInFirstWeek) {\r
+                               weekInYear--;\r
+                       }\r
+                       return weekInYear;\r
+               };\r
+\r
+               Date.prototype.getWeekInMonth = function(minimalDaysInFirstWeek) {\r
+                       if (isUndefined(this.minimalDaysInFirstWeek)) {\r
+                               minimalDaysInFirstWeek = DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK;\r
+                       }\r
+                       var previousSunday = this.getPreviousSunday();\r
+                       var startOfMonth = newDateAtMidnight(this.getFullYear(), this.getMonth(), 1);\r
+                       var numberOfSundays = previousSunday.isBefore(startOfMonth) ?\r
+                               0 : 1 + Math.floor(previousSunday.getTimeSince(startOfMonth) / ONE_WEEK);\r
+                       var numberOfDaysInFirstWeek =  7 - startOfMonth.getDay();\r
+                       var weekInMonth = numberOfSundays;\r
+                       if (numberOfDaysInFirstWeek >= minimalDaysInFirstWeek) {\r
+                               weekInMonth++;\r
+                       }\r
+                       return weekInMonth;\r
+               };\r
+\r
+               Date.prototype.getDayInYear = function() {\r
+                       var startOfYear = newDateAtMidnight(this.getFullYear(), 0, 1);\r
+                       return 1 + Math.floor(this.getTimeSince(startOfYear) / ONE_DAY);\r
+               };\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               SimpleDateFormat = function(formatString) {\r
+                       this.formatString = formatString;\r
+               };\r
+\r
+               /**\r
+                * Sets the minimum number of days in a week in order for that week to\r
+                * be considered as belonging to a particular month or year\r
+                */\r
+               SimpleDateFormat.prototype.setMinimalDaysInFirstWeek = function(days) {\r
+                       this.minimalDaysInFirstWeek = days;\r
+               };\r
+\r
+               SimpleDateFormat.prototype.getMinimalDaysInFirstWeek = function() {\r
+                       return isUndefined(this.minimalDaysInFirstWeek) ?\r
+                               DEFAULT_MINIMAL_DAYS_IN_FIRST_WEEK : this.minimalDaysInFirstWeek;\r
+               };\r
+\r
+               var padWithZeroes = function(str, len) {\r
+                       while (str.length < len) {\r
+                               str = "0" + str;\r
+                       }\r
+                       return str;\r
+               };\r
+\r
+               var formatText = function(data, numberOfLetters, minLength) {\r
+                       return (numberOfLetters >= 4) ? data : data.substr(0, Math.max(minLength, numberOfLetters));\r
+               };\r
+\r
+               var formatNumber = function(data, numberOfLetters) {\r
+                       var dataString = "" + data;\r
+                       // Pad with 0s as necessary\r
+                       return padWithZeroes(dataString, numberOfLetters);\r
+               };\r
+\r
+               SimpleDateFormat.prototype.format = function(date) {\r
+                       var formattedString = "";\r
+                       var result;\r
+                       var searchString = this.formatString;\r
+                       while ((result = regex.exec(searchString))) {\r
+                               var quotedString = result[1];\r
+                               var patternLetters = result[2];\r
+                               var otherLetters = result[3];\r
+                               var otherCharacters = result[4];\r
+\r
+                               // If the pattern matched is quoted string, output the text between the quotes\r
+                               if (quotedString) {\r
+                                       if (quotedString == "''") {\r
+                                               formattedString += "'";\r
+                                       } else {\r
+                                               formattedString += quotedString.substring(1, quotedString.length - 1);\r
+                                       }\r
+                               } else if (otherLetters) {\r
+                                       // Swallow non-pattern letters by doing nothing here\r
+                               } else if (otherCharacters) {\r
+                                       // Simply output other characters\r
+                                       formattedString += otherCharacters;\r
+                               } else if (patternLetters) {\r
+                                       // Replace pattern letters\r
+                                       var patternLetter = patternLetters.charAt(0);\r
+                                       var numberOfLetters = patternLetters.length;\r
+                                       var rawData = "";\r
+                                       switch(patternLetter) {\r
+                                               case "G":\r
+                                                       rawData = "AD";\r
+                                                       break;\r
+                                               case "y":\r
+                                                       rawData = date.getFullYear();\r
+                                                       break;\r
+                                               case "M":\r
+                                                       rawData = date.getMonth();\r
+                                                       break;\r
+                                               case "w":\r
+                                                       rawData = date.getWeekInYear(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "W":\r
+                                                       rawData = date.getWeekInMonth(this.getMinimalDaysInFirstWeek());\r
+                                                       break;\r
+                                               case "D":\r
+                                                       rawData = date.getDayInYear();\r
+                                                       break;\r
+                                               case "d":\r
+                                                       rawData = date.getDate();\r
+                                                       break;\r
+                                               case "F":\r
+                                                       rawData = 1 + Math.floor((date.getDate() - 1) / 7);\r
+                                                       break;\r
+                                               case "E":\r
+                                                       rawData = dayNames[date.getDay()];\r
+                                                       break;\r
+                                               case "a":\r
+                                                       rawData = (date.getHours() >= 12) ? "PM" : "AM";\r
+                                                       break;\r
+                                               case "H":\r
+                                                       rawData = date.getHours();\r
+                                                       break;\r
+                                               case "k":\r
+                                                       rawData = date.getHours() || 24;\r
+                                                       break;\r
+                                               case "K":\r
+                                                       rawData = date.getHours() % 12;\r
+                                                       break;\r
+                                               case "h":\r
+                                                       rawData = (date.getHours() % 12) || 12;\r
+                                                       break;\r
+                                               case "m":\r
+                                                       rawData = date.getMinutes();\r
+                                                       break;\r
+                                               case "s":\r
+                                                       rawData = date.getSeconds();\r
+                                                       break;\r
+                                               case "S":\r
+                                                       rawData = date.getMilliseconds();\r
+                                                       break;\r
+                                               case "Z":\r
+                                                       rawData = date.getTimezoneOffset(); // This returns the number of minutes since GMT was this time.\r
+                                                       break;\r
+                                       }\r
+                                       // Format the raw data depending on the type\r
+                                       switch(types[patternLetter]) {\r
+                                               case TEXT2:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 2);\r
+                                                       break;\r
+                                               case TEXT3:\r
+                                                       formattedString += formatText(rawData, numberOfLetters, 3);\r
+                                                       break;\r
+                                               case NUMBER:\r
+                                                       formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       break;\r
+                                               case YEAR:\r
+                                                       if (numberOfLetters <= 3) {\r
+                                                               // Output a 2-digit year\r
+                                                               var dataString = "" + rawData;\r
+                                                               formattedString += dataString.substr(2, 2);\r
+                                                       } else {\r
+                                                               formattedString += formatNumber(rawData, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case MONTH:\r
+                                                       if (numberOfLetters >= 3) {\r
+                                                               formattedString += formatText(monthNames[rawData], numberOfLetters, numberOfLetters);\r
+                                                       } else {\r
+                                                               // NB. Months returned by getMonth are zero-based\r
+                                                               formattedString += formatNumber(rawData + 1, numberOfLetters);\r
+                                                       }\r
+                                                       break;\r
+                                               case TIMEZONE:\r
+                                                       var isPositive = (rawData > 0);\r
+                                                       // The following line looks like a mistake but isn't\r
+                                                       // because of the way getTimezoneOffset measures.\r
+                                                       var prefix = isPositive ? "-" : "+";\r
+                                                       var absData = Math.abs(rawData);\r
+\r
+                                                       // Hours\r
+                                                       var hours = "" + Math.floor(absData / 60);\r
+                                                       hours = padWithZeroes(hours, 2);\r
+                                                       // Minutes\r
+                                                       var minutes = "" + (absData % 60);\r
+                                                       minutes = padWithZeroes(minutes, 2);\r
+\r
+                                                       formattedString += prefix + hours + minutes;\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               searchString = searchString.substr(result.index + result[0].length);\r
+                       }\r
+                       return formattedString;\r
+               };\r
+       })();\r
+\r
+       log4javascript.SimpleDateFormat = SimpleDateFormat;\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // PatternLayout\r
+\r
+       function PatternLayout(pattern) {\r
+               if (pattern) {\r
+                       this.pattern = pattern;\r
+               } else {\r
+                       this.pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;\r
+               }\r
+               this.customFields = [];\r
+       }\r
+\r
+       PatternLayout.TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n";\r
+       PatternLayout.DEFAULT_CONVERSION_PATTERN = "%m%n";\r
+       PatternLayout.ISO8601_DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";\r
+       PatternLayout.DATETIME_DATEFORMAT = "dd MMM yyyy HH:mm:ss,SSS";\r
+       PatternLayout.ABSOLUTETIME_DATEFORMAT = "HH:mm:ss,SSS";\r
+\r
+       PatternLayout.prototype = new Layout();\r
+\r
+       PatternLayout.prototype.format = function(loggingEvent) {\r
+               var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([acdfmMnpr%])(\{([^\}]+)\})?|([^%]+)/;\r
+               var formattedString = "";\r
+               var result;\r
+               var searchString = this.pattern;\r
+\r
+               // Cannot use regex global flag since it doesn't work with exec in IE5\r
+               while ((result = regex.exec(searchString))) {\r
+                       var matchedString = result[0];\r
+                       var padding = result[1];\r
+                       var truncation = result[2];\r
+                       var conversionCharacter = result[3];\r
+                       var specifier = result[5];\r
+                       var text = result[6];\r
+\r
+                       // Check if the pattern matched was just normal text\r
+                       if (text) {\r
+                               formattedString += "" + text;\r
+                       } else {\r
+                               // Create a raw replacement string based on the conversion\r
+                               // character and specifier\r
+                               var replacement = "";\r
+                               switch(conversionCharacter) {\r
+                                       case "a": // Array of messages\r
+                                       case "m": // Message\r
+                                               var depth = 0;\r
+                                               if (specifier) {\r
+                                                       depth = parseInt(specifier, 10);\r
+                                                       if (isNaN(depth)) {\r
+                                                               handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                       specifier + "' for conversion character '" + conversionCharacter +\r
+                                                                       "' - should be a number");\r
+                                                               depth = 0;\r
+                                                       }\r
+                                               }\r
+                                               var messages = (conversionCharacter === "a") ? loggingEvent.messages[0] : loggingEvent.messages;\r
+                                               for (var i = 0, len = messages.length; i < len; i++) {\r
+                                                       if (i > 0 && (replacement.charAt(replacement.length - 1) !== " ")) {\r
+                                                               replacement += " ";\r
+                                                       }\r
+                                                       if (depth === 0) {\r
+                                                               replacement += messages[i];\r
+                                                       } else {\r
+                                                               replacement += formatObjectExpansion(messages[i], depth);\r
+                                                       }\r
+                                               }\r
+                                               break;\r
+                                       case "c": // Logger name\r
+                                               var loggerName = loggingEvent.logger.name;\r
+                                               if (specifier) {\r
+                                                       var precision = parseInt(specifier, 10);\r
+                                                       var loggerNameBits = loggingEvent.logger.name.split(".");\r
+                                                       if (precision >= loggerNameBits.length) {\r
+                                                               replacement = loggerName;\r
+                                                       } else {\r
+                                                               replacement = loggerNameBits.slice(loggerNameBits.length - precision).join(".");\r
+                                                       }\r
+                                               } else {\r
+                                                       replacement = loggerName;\r
+                                               }\r
+                                               break;\r
+                                       case "d": // Date\r
+                                               var dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                               if (specifier) {\r
+                                                       dateFormat = specifier;\r
+                                                       // Pick up special cases\r
+                                                       if (dateFormat == "ISO8601") {\r
+                                                               dateFormat = PatternLayout.ISO8601_DATEFORMAT;\r
+                                                       } else if (dateFormat == "ABSOLUTE") {\r
+                                                               dateFormat = PatternLayout.ABSOLUTETIME_DATEFORMAT;\r
+                                                       } else if (dateFormat == "DATE") {\r
+                                                               dateFormat = PatternLayout.DATETIME_DATEFORMAT;\r
+                                                       }\r
+                                               }\r
+                                               // Format the date\r
+                                               replacement = (new SimpleDateFormat(dateFormat)).format(loggingEvent.timeStamp);\r
+                                               break;\r
+                                       case "f": // Custom field\r
+                                               if (this.hasCustomFields()) {\r
+                                                       var fieldIndex = 0;\r
+                                                       if (specifier) {\r
+                                                               fieldIndex = parseInt(specifier, 10);\r
+                                                               if (isNaN(fieldIndex)) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - should be a number");\r
+                                                               } else if (fieldIndex === 0) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - must be greater than zero");\r
+                                                               } else if (fieldIndex > this.customFields.length) {\r
+                                                                       handleError("PatternLayout.format: invalid specifier '" +\r
+                                                                               specifier + "' for conversion character 'f' - there aren't that many custom fields");\r
+                                                               } else {\r
+                                                                       fieldIndex = fieldIndex - 1;\r
+                                                               }\r
+                                                       }\r
+                            var val = this.customFields[fieldIndex].value;\r
+                            if (typeof val == "function") {\r
+                                val = val(this, loggingEvent);\r
+                            }\r
+                            replacement = val;\r
+                                               }\r
+                                               break;\r
+                                       case "n": // New line\r
+                                               replacement = newLine;\r
+                                               break;\r
+                                       case "p": // Level\r
+                                               replacement = loggingEvent.level.name;\r
+                                               break;\r
+                                       case "r": // Milliseconds since log4javascript startup\r
+                                               replacement = "" + loggingEvent.timeStamp.getDifference(applicationStartDate);\r
+                                               break;\r
+                                       case "%": // Literal % sign\r
+                                               replacement = "%";\r
+                                               break;\r
+                                       default:\r
+                                               replacement = matchedString;\r
+                                               break;\r
+                               }\r
+                               // Format the replacement according to any padding or\r
+                               // truncation specified\r
+                               var l;\r
+\r
+                               // First, truncation\r
+                               if (truncation) {\r
+                                       l = parseInt(truncation.substr(1), 10);\r
+                                       var strLen = replacement.length;\r
+                                       if (l < strLen) {\r
+                                               replacement = replacement.substring(strLen - l, strLen);\r
+                                       }\r
+                               }\r
+                               // Next, padding\r
+                               if (padding) {\r
+                                       if (padding.charAt(0) == "-") {\r
+                                               l = parseInt(padding.substr(1), 10);\r
+                                               // Right pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement += " ";\r
+                                               }\r
+                                       } else {\r
+                                               l = parseInt(padding, 10);\r
+                                               // Left pad with spaces\r
+                                               while (replacement.length < l) {\r
+                                                       replacement = " " + replacement;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               formattedString += replacement;\r
+                       }\r
+                       searchString = searchString.substr(result.index + result[0].length);\r
+               }\r
+               return formattedString;\r
+       };\r
+\r
+       PatternLayout.prototype.ignoresThrowable = function() {\r
+           return true;\r
+       };\r
+\r
+       PatternLayout.prototype.toString = function() {\r
+           return "PatternLayout";\r
+       };\r
+\r
+       log4javascript.PatternLayout = PatternLayout;\r
+       /* ---------------------------------------------------------------------- */\r
+       // AlertAppender\r
+\r
+       function AlertAppender() {}\r
+\r
+       AlertAppender.prototype = new Appender();\r
+\r
+       AlertAppender.prototype.layout = new SimpleLayout();\r
+\r
+       AlertAppender.prototype.append = function(loggingEvent) {\r
+               var formattedMessage = this.getLayout().format(loggingEvent);\r
+               if (this.getLayout().ignoresThrowable()) {\r
+                       formattedMessage += loggingEvent.getThrowableStrRep();\r
+               }\r
+               alert(formattedMessage);\r
+       };\r
+\r
+       AlertAppender.prototype.toString = function() {\r
+               return "AlertAppender";\r
+       };\r
+\r
+       log4javascript.AlertAppender = AlertAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // BrowserConsoleAppender (only works in Opera and Safari and Firefox with\r
+       // Firebug extension)\r
+\r
+       function BrowserConsoleAppender() {}\r
+\r
+       BrowserConsoleAppender.prototype = new log4javascript.Appender();\r
+       BrowserConsoleAppender.prototype.layout = new NullLayout();\r
+       BrowserConsoleAppender.prototype.threshold = Level.DEBUG;\r
+\r
+       BrowserConsoleAppender.prototype.append = function(loggingEvent) {\r
+               var appender = this;\r
+\r
+               var getFormattedMessage = function() {\r
+                       var layout = appender.getLayout();\r
+                       var formattedMessage = layout.format(loggingEvent);\r
+                       if (layout.ignoresThrowable() && loggingEvent.exception) {\r
+                               formattedMessage += loggingEvent.getThrowableStrRep();\r
+                       }\r
+                       return formattedMessage;\r
+               };\r
+\r
+               if ((typeof opera != "undefined") && opera.postError) { // Opera\r
+                       opera.postError(getFormattedMessage());\r
+               } else if (window.console && window.console.log) { // Safari and Firebug\r
+                       var formattedMesage = getFormattedMessage();\r
+                       // Log to Firebug using its logging methods or revert to the console.log\r
+                       // method in Safari\r
+                       if (window.console.debug && Level.DEBUG.isGreaterOrEqual(loggingEvent.level)) {\r
+                               window.console.debug(formattedMesage);\r
+                       } else if (window.console.info && Level.INFO.equals(loggingEvent.level)) {\r
+                               window.console.info(formattedMesage);\r
+                       } else if (window.console.warn && Level.WARN.equals(loggingEvent.level)) {\r
+                               window.console.warn(formattedMesage);\r
+                       } else if (window.console.error && loggingEvent.level.isGreaterOrEqual(Level.ERROR)) {\r
+                               window.console.error(formattedMesage);\r
+                       } else {\r
+                               window.console.log(formattedMesage);\r
+                       }\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.group = function(name) {\r
+               if (window.console && window.console.group) {\r
+                       window.console.group(name);\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.groupEnd = function() {\r
+               if (window.console && window.console.groupEnd) {\r
+                       window.console.groupEnd();\r
+               }\r
+       };\r
+\r
+       BrowserConsoleAppender.prototype.toString = function() {\r
+               return "BrowserConsoleAppender";\r
+       };\r
+\r
+       log4javascript.BrowserConsoleAppender = BrowserConsoleAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender related\r
+\r
+       var xmlHttpFactories = [\r
+               function() { return new XMLHttpRequest(); },\r
+               function() { return new ActiveXObject("Msxml2.XMLHTTP"); },\r
+               function() { return new ActiveXObject("Microsoft.XMLHTTP"); }\r
+       ];\r
+\r
+       var getXmlHttp = function(errorHandler) {\r
+               // This is only run the first time; the value of getXmlHttp gets\r
+               // replaced with the factory that succeeds on the first run\r
+               var xmlHttp = null, factory;\r
+               for (var i = 0, len = xmlHttpFactories.length; i < len; i++) {\r
+                       factory = xmlHttpFactories[i];\r
+                       try {\r
+                               xmlHttp = factory();\r
+                               getXmlHttp = factory;\r
+                               return xmlHttp;\r
+                       } catch (e) {\r
+                       }\r
+               }\r
+               // If we're here, all factories have failed, so throw an error\r
+               if (errorHandler) {\r
+                       errorHandler();\r
+               } else {\r
+                       handleError("getXmlHttp: unable to obtain XMLHttpRequest object");\r
+               }\r
+       };\r
+\r
+       function isHttpRequestSuccessful(xmlHttp) {\r
+               return isUndefined(xmlHttp.status) || xmlHttp.status === 0 ||\r
+                       (xmlHttp.status >= 200 && xmlHttp.status < 300) ||\r
+                       xmlHttp.status == 1223 /* Fix for IE */;\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // AjaxAppender\r
+\r
+       function AjaxAppender(url) {\r
+               var appender = this;\r
+               var isSupported = true;\r
+               if (!url) {\r
+                       handleError("AjaxAppender: URL must be specified in constructor");\r
+                       isSupported = false;\r
+               }\r
+\r
+               var timed = this.defaults.timed;\r
+               var waitForResponse = this.defaults.waitForResponse;\r
+               var batchSize = this.defaults.batchSize;\r
+               var timerInterval = this.defaults.timerInterval;\r
+               var requestSuccessCallback = this.defaults.requestSuccessCallback;\r
+               var failCallback = this.defaults.failCallback;\r
+               var postVarName = this.defaults.postVarName;\r
+               var sendAllOnUnload = this.defaults.sendAllOnUnload;\r
+               var contentType = this.defaults.contentType;\r
+               var sessionId = null;\r
+\r
+               var queuedLoggingEvents = [];\r
+               var queuedRequests = [];\r
+               var headers = [];\r
+               var sending = false;\r
+               var initialized = false;\r
+\r
+               // Configuration methods. The function scope is used to prevent\r
+               // direct alteration to the appender configuration properties.\r
+               function checkCanConfigure(configOptionName) {\r
+                       if (initialized) {\r
+                               handleError("AjaxAppender: configuration option '" +\r
+                                       configOptionName +\r
+                                       "' may not be set after the appender has been initialized");\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               this.getSessionId = function() { return sessionId; };\r
+               this.setSessionId = function(sessionIdParam) {\r
+                       sessionId = extractStringFromParam(sessionIdParam, null);\r
+                       this.layout.setCustomField("sessionid", sessionId);\r
+               };\r
+\r
+               this.setLayout = function(layoutParam) {\r
+                       if (checkCanConfigure("layout")) {\r
+                               this.layout = layoutParam;\r
+                               // Set the session id as a custom field on the layout, if not already present\r
+                               if (sessionId !== null) {\r
+                                       this.setSessionId(sessionId);\r
+                               }\r
+                       }\r
+               };\r
+\r
+               this.isTimed = function() { return timed; };\r
+               this.setTimed = function(timedParam) {\r
+                       if (checkCanConfigure("timed")) {\r
+                               timed = bool(timedParam);\r
+                       }\r
+               };\r
+\r
+               this.getTimerInterval = function() { return timerInterval; };\r
+               this.setTimerInterval = function(timerIntervalParam) {\r
+                       if (checkCanConfigure("timerInterval")) {\r
+                               timerInterval = extractIntFromParam(timerIntervalParam, timerInterval);\r
+                       }\r
+               };\r
+\r
+               this.isWaitForResponse = function() { return waitForResponse; };\r
+               this.setWaitForResponse = function(waitForResponseParam) {\r
+                       if (checkCanConfigure("waitForResponse")) {\r
+                               waitForResponse = bool(waitForResponseParam);\r
+                       }\r
+               };\r
+\r
+               this.getBatchSize = function() { return batchSize; };\r
+               this.setBatchSize = function(batchSizeParam) {\r
+                       if (checkCanConfigure("batchSize")) {\r
+                               batchSize = extractIntFromParam(batchSizeParam, batchSize);\r
+                       }\r
+               };\r
+\r
+               this.isSendAllOnUnload = function() { return sendAllOnUnload; };\r
+               this.setSendAllOnUnload = function(sendAllOnUnloadParam) {\r
+                       if (checkCanConfigure("sendAllOnUnload")) {\r
+                               sendAllOnUnload = extractBooleanFromParam(sendAllOnUnloadParam, sendAllOnUnload);\r
+                       }\r
+               };\r
+\r
+               this.setRequestSuccessCallback = function(requestSuccessCallbackParam) {\r
+                       requestSuccessCallback = extractFunctionFromParam(requestSuccessCallbackParam, requestSuccessCallback);\r
+               };\r
+\r
+               this.setFailCallback = function(failCallbackParam) {\r
+                       failCallback = extractFunctionFromParam(failCallbackParam, failCallback);\r
+               };\r
+\r
+               this.getPostVarName = function() { return postVarName; };\r
+               this.setPostVarName = function(postVarNameParam) {\r
+                       if (checkCanConfigure("postVarName")) {\r
+                               postVarName = extractStringFromParam(postVarNameParam, postVarName);\r
+                       }\r
+               };\r
+\r
+               this.getHeaders = function() { return headers; };\r
+               this.addHeader = function(name, value) {\r
+                       if (name.toLowerCase() == "content-type") {\r
+                               contentType = value;\r
+                       } else {\r
+                               headers.push( { name: name, value: value } );\r
+                       }\r
+               };\r
+\r
+               // Internal functions\r
+               function sendAll() {\r
+                       if (isSupported && enabled) {\r
+                               sending = true;\r
+                               var currentRequestBatch;\r
+                               if (waitForResponse) {\r
+                                       // Send the first request then use this function as the callback once\r
+                                       // the response comes back\r
+                                       if (queuedRequests.length > 0) {\r
+                                               currentRequestBatch = queuedRequests.shift();\r
+                                               sendRequest(preparePostData(currentRequestBatch), sendAll);\r
+                                       } else {\r
+                                               sending = false;\r
+                                               if (timed) {\r
+                                                       scheduleSending();\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       // Rattle off all the requests without waiting to see the response\r
+                                       while ((currentRequestBatch = queuedRequests.shift())) {\r
+                                               sendRequest(preparePostData(currentRequestBatch));\r
+                                       }\r
+                                       sending = false;\r
+                                       if (timed) {\r
+                                               scheduleSending();\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.sendAll = sendAll;\r
+\r
+               // Called when the window unloads. At this point we're past caring about\r
+               // waiting for responses or timers or incomplete batches - everything\r
+               // must go, now\r
+               function sendAllRemaining() {\r
+                       var sendingAnything = false;\r
+                       if (isSupported && enabled) {\r
+                               // Create requests for everything left over, batched as normal\r
+                               var actualBatchSize = appender.getLayout().allowBatching() ? batchSize : 1;\r
+                               var currentLoggingEvent;\r
+                               var batchedLoggingEvents = [];\r
+                               while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                       batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                               // Queue this batch of log entries\r
+                                               queuedRequests.push(batchedLoggingEvents);\r
+                                               batchedLoggingEvents = [];\r
+                                       }\r
+                               }\r
+                               // If there's a partially completed batch, add it\r
+                               if (batchedLoggingEvents.length > 0) {\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+                               }\r
+                               sendingAnything = (queuedRequests.length > 0);\r
+                               waitForResponse = false;\r
+                               timed = false;\r
+                               sendAll();\r
+                       }\r
+                       return sendingAnything;\r
+               }\r
+\r
+               this.sendAllRemaining = sendAllRemaining;\r
+\r
+               function preparePostData(batchedLoggingEvents) {\r
+                       // Format the logging events\r
+                       var formattedMessages = [];\r
+                       var currentLoggingEvent;\r
+                       var postData = "";\r
+                       while ((currentLoggingEvent = batchedLoggingEvents.shift())) {\r
+                               var currentFormattedMessage = appender.getLayout().format(currentLoggingEvent);\r
+                               if (appender.getLayout().ignoresThrowable()) {\r
+                                       currentFormattedMessage += currentLoggingEvent.getThrowableStrRep();\r
+                               }\r
+                               formattedMessages.push(currentFormattedMessage);\r
+                       }\r
+                       // Create the post data string\r
+                       if (batchedLoggingEvents.length == 1) {\r
+                               postData = formattedMessages.join("");\r
+                       } else {\r
+                               postData = appender.getLayout().batchHeader +\r
+                                       formattedMessages.join(appender.getLayout().batchSeparator) +\r
+                                       appender.getLayout().batchFooter;\r
+                       }\r
+                       if (contentType == appender.defaults.contentType) {\r
+                               postData = appender.getLayout().returnsPostData ? postData :\r
+                                       urlEncode(postVarName) + "=" + urlEncode(postData);\r
+                               // Add the layout name to the post data\r
+                               if (postData.length > 0) {\r
+                                       postData += "&";\r
+                               }\r
+                               postData += "layout=" + urlEncode(appender.getLayout().toString());\r
+                       }\r
+                       return postData;\r
+               }\r
+\r
+               function scheduleSending() {\r
+                       window.setTimeout(sendAll, timerInterval);\r
+               }\r
+\r
+               function xmlHttpErrorHandler() {\r
+                       var msg = "AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";\r
+                       handleError(msg);\r
+                       isSupported = false;\r
+                       if (failCallback) {\r
+                               failCallback(msg);\r
+                       }\r
+               }\r
+\r
+               function sendRequest(postData, successCallback) {\r
+                       try {\r
+                               var xmlHttp = getXmlHttp(xmlHttpErrorHandler);\r
+                               if (isSupported) {\r
+                                       if (xmlHttp.overrideMimeType) {\r
+                                               xmlHttp.overrideMimeType(appender.getLayout().getContentType());\r
+                                       }\r
+                                       xmlHttp.onreadystatechange = function() {\r
+                                               if (xmlHttp.readyState == 4) {\r
+                                                       if (isHttpRequestSuccessful(xmlHttp)) {\r
+                                                               if (requestSuccessCallback) {\r
+                                                                       requestSuccessCallback(xmlHttp);\r
+                                                               }\r
+                                                               if (successCallback) {\r
+                                                                       successCallback(xmlHttp);\r
+                                                               }\r
+                                                       } else {\r
+                                                               var msg = "AjaxAppender.append: XMLHttpRequest request to URL " +\r
+                                                                       url + " returned status code " + xmlHttp.status;\r
+                                                               handleError(msg);\r
+                                                               if (failCallback) {\r
+                                                                       failCallback(msg);\r
+                                                               }\r
+                                                       }\r
+                                                       xmlHttp.onreadystatechange = emptyFunction;\r
+                                                       xmlHttp = null;\r
+                                               }\r
+                                       };\r
+                                       xmlHttp.open("POST", url, true);\r
+                                       try {\r
+                                               for (var i = 0, header; header = headers[i++]; ) {\r
+                                                       xmlHttp.setRequestHeader(header.name, header.value);\r
+                                               }\r
+                                               xmlHttp.setRequestHeader("Content-Type", contentType);\r
+                                       } catch (headerEx) {\r
+                                               var msg = "AjaxAppender.append: your browser's XMLHttpRequest implementation" +\r
+                                                       " does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";\r
+                                               handleError(msg);\r
+                                               isSupported = false;\r
+                                               if (failCallback) {\r
+                                                       failCallback(msg);\r
+                                               }\r
+                                               return;\r
+                                       }\r
+                                       xmlHttp.send(postData);\r
+                               }\r
+                       } catch (ex) {\r
+                               var errMsg = "AjaxAppender.append: error sending log message to " + url;\r
+                               handleError(errMsg, ex);\r
+                               isSupported = false;\r
+                               if (failCallback) {\r
+                                       failCallback(errMsg + ". Details: " + getExceptionStringRep(ex));\r
+                               }\r
+                       }\r
+               }\r
+\r
+               this.append = function(loggingEvent) {\r
+                       if (isSupported) {\r
+                               if (!initialized) {\r
+                                       init();\r
+                               }\r
+                               queuedLoggingEvents.push(loggingEvent);\r
+                               var actualBatchSize = this.getLayout().allowBatching() ? batchSize : 1;\r
+\r
+                               if (queuedLoggingEvents.length >= actualBatchSize) {\r
+                                       var currentLoggingEvent;\r
+                                       var batchedLoggingEvents = [];\r
+                                       while ((currentLoggingEvent = queuedLoggingEvents.shift())) {\r
+                                               batchedLoggingEvents.push(currentLoggingEvent);\r
+                                       }\r
+                                       // Queue this batch of log entries\r
+                                       queuedRequests.push(batchedLoggingEvents);\r
+\r
+                                       // If using a timer, the queue of requests will be processed by the\r
+                                       // timer function, so nothing needs to be done here.\r
+                                       if (!timed && (!waitForResponse || (waitForResponse && !sending))) {\r
+                                               sendAll();\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+               function init() {\r
+                       initialized = true;\r
+                       // Add unload event to send outstanding messages\r
+                       if (sendAllOnUnload) {\r
+                               var oldBeforeUnload = window.onbeforeunload;\r
+                               window.onbeforeunload = function() {\r
+                                       if (oldBeforeUnload) {\r
+                                               oldBeforeUnload();\r
+                                       }\r
+                                       if (sendAllRemaining()) {\r
+                                               return "Sending log messages";\r
+                                       }\r
+                               };\r
+                       }\r
+                       // Start timer\r
+                       if (timed) {\r
+                               scheduleSending();\r
+                       }\r
+               }\r
+       }\r
+\r
+       AjaxAppender.prototype = new Appender();\r
+\r
+       AjaxAppender.prototype.defaults = {\r
+               waitForResponse: false,\r
+               timed: false,\r
+               timerInterval: 1000,\r
+               batchSize: 1,\r
+               sendAllOnUnload: false,\r
+               requestSuccessCallback: null,\r
+               failCallback: null,\r
+               postVarName: "data",\r
+               contentType: "application/x-www-form-urlencoded"\r
+       };\r
+\r
+       AjaxAppender.prototype.layout = new HttpPostDataLayout();\r
+\r
+       AjaxAppender.prototype.toString = function() {\r
+               return "AjaxAppender";\r
+       };\r
+\r
+       log4javascript.AjaxAppender = AjaxAppender;\r
+       /* ---------------------------------------------------------------------- */\r
+       // PopUpAppender and InPageAppender related\r
+\r
+       function setCookie(name, value, days, path) {\r
+           var expires;\r
+           path = path ? "; path=" + path : "";\r
+               if (days) {\r
+                       var date = new Date();\r
+                       date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r
+                       expires = "; expires=" + date.toGMTString();\r
+               } else {\r
+                   expires = "";\r
+           }\r
+               document.cookie = escape(name) + "=" + escape(value) + expires + path;\r
+       }\r
+\r
+       function getCookie(name) {\r
+               var nameEquals = escape(name) + "=";\r
+               var ca = document.cookie.split(";");\r
+               for (var i = 0, len = ca.length; i < len; i++) {\r
+                       var c = ca[i];\r
+                       while (c.charAt(0) === " ") {\r
+                           c = c.substring(1, c.length);\r
+                       }\r
+                       if (c.indexOf(nameEquals) === 0) {\r
+                           return unescape(c.substring(nameEquals.length, c.length));\r
+               }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       // Gets the base URL of the location of the log4javascript script.\r
+       // This is far from infallible.\r
+       function getBaseUrl() {\r
+               var scripts = document.getElementsByTagName("script");\r
+               for (var i = 0, len = scripts.length; i < len; ++i) {\r
+                       if (scripts[i].src.indexOf("log4javascript") != -1) {\r
+                               var lastSlash = scripts[i].src.lastIndexOf("/");\r
+                               return (lastSlash == -1) ? "" : scripts[i].src.substr(0, lastSlash + 1);\r
+                       }\r
+               }\r
+        return null;\r
+    }\r
+\r
+       function isLoaded(win) {\r
+               try {\r
+                       return bool(win.loaded);\r
+               } catch (ex) {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // ConsoleAppender (prototype for PopUpAppender and InPageAppender)\r
+\r
+       var ConsoleAppender;\r
+\r
+       // Create an anonymous function to protect base console methods\r
+       (function() {\r
+               var getConsoleHtmlLines = function() {\r
+                       return [\r
+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',\r
+'<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">',\r
+'      <head>',\r
+'              <title>log4javascript</title>',\r
+'              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />',\r
+'              <!-- Make IE8 behave like IE7, having gone to all the trouble of making IE work -->',\r
+'              <meta http-equiv="X-UA-Compatible" content="IE=7" />',\r
+'              <script type="text/javascript">var isIe = false, isIePre7 = false;</script>',\r
+'              <!--[if IE]><script type="text/javascript">isIe = true</script><![endif]-->',\r
+'              <!--[if lt IE 7]><script type="text/javascript">isIePre7 = true</script><![endif]-->',\r
+'              <script type="text/javascript">',\r
+'                      //<![CDATA[',\r
+'                      var loggingEnabled = true;',\r
+'                      var logQueuedEventsTimer = null;',\r
+'                      var logEntries = [];',\r
+'                      var logEntriesAndSeparators = [];',\r
+'                      var logItems = [];',\r
+'                      var renderDelay = 100;',\r
+'                      var unrenderedLogItemsExist = false;',\r
+'                      var rootGroup, currentGroup = null;',\r
+'                      var loaded = false;',\r
+'                      var currentLogItem = null;',\r
+'                      var logMainContainer;',\r
+'',\r
+'                      function copyProperties(obj, props) {',\r
+'                              for (var i in props) {',\r
+'                                      obj[i] = props[i];',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItem() {',\r
+'                      }',\r
+'',\r
+'                      LogItem.prototype = {',\r
+'                              mainContainer: null,',\r
+'                              wrappedContainer: null,',\r
+'                              unwrappedContainer: null,',\r
+'                              group: null,',\r
+'',\r
+'                              appendToLog: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].appendToLog();',\r
+'                                      }',\r
+'                                      this.group.update();',\r
+'                              },',\r
+'',\r
+'                              doRemove: function(doUpdate, removeFromGroup) {',\r
+'                                      if (this.rendered) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].remove();',\r
+'                                              }',\r
+'                                              this.unwrappedElementContainer = null;',\r
+'                                              this.wrappedElementContainer = null;',\r
+'                                              this.mainElementContainer = null;',\r
+'                                      }',\r
+'                                      if (this.group && removeFromGroup) {',\r
+'                                              this.group.removeChild(this, doUpdate);',\r
+'                                      }',\r
+'                                      if (this === currentLogItem) {',\r
+'                                              currentLogItem = null;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function(doUpdate, removeFromGroup) {',\r
+'                                      this.doRemove(doUpdate, removeFromGroup);',\r
+'                              },',\r
+'',\r
+'                              render: function() {},',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visit(this);',\r
+'                              },',\r
+'',\r
+'                              getUnwrappedDomContainer: function() {',\r
+'                                      return this.group.unwrappedElementContainer.contentDiv;',\r
+'                              },',\r
+'',\r
+'                              getWrappedDomContainer: function() {',\r
+'                                      return this.group.wrappedElementContainer.contentDiv;',\r
+'                              },',\r
+'',\r
+'                              getMainDomContainer: function() {',\r
+'                                      return this.group.mainElementContainer.contentDiv;',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      LogItem.serializedItemKeys = {LOG_ENTRY: 0, GROUP_START: 1, GROUP_END: 2};',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemContainerElement() {',\r
+'                      }',\r
+'',\r
+'                      LogItemContainerElement.prototype = {',\r
+'                              appendToLog: function() {',\r
+'                                      var insertBeforeFirst = (newestAtTop && this.containerDomNode.hasChildNodes());',\r
+'                                      if (insertBeforeFirst) {',\r
+'                                              this.containerDomNode.insertBefore(this.mainDiv, this.containerDomNode.firstChild);',\r
+'                                      } else {',\r
+'                                              this.containerDomNode.appendChild(this.mainDiv);',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function SeparatorElementContainer(containerDomNode) {',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "separator";',\r
+'                              this.mainDiv.innerHTML = "&nbsp;";',\r
+'                      }',\r
+'',\r
+'                      SeparatorElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      SeparatorElementContainer.prototype.remove = function() {',\r
+'                              this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                              this.mainDiv = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function Separator() {',\r
+'                              this.rendered = false;',\r
+'                      }',\r
+'',\r
+'                      Separator.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(Separator.prototype, {',\r
+'                              render: function() {',\r
+'                                      var containerDomNode = this.group.contentDiv;',\r
+'                                      if (isIe) {',\r
+'                                              this.unwrappedElementContainer = new SeparatorElementContainer(this.getUnwrappedDomContainer());',\r
+'                                              this.wrappedElementContainer = new SeparatorElementContainer(this.getWrappedDomContainer());',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              this.mainElementContainer = new SeparatorElementContainer(this.getMainDomContainer());',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.content = this.formattedMessage;',\r
+'                                      this.rendered = true;',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function GroupElementContainer(group, containerDomNode, isRoot, isWrapped) {',\r
+'                              this.group = group;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.isRoot = isRoot;',\r
+'                              this.isWrapped = isWrapped;',\r
+'                              this.expandable = false;',\r
+'',\r
+'                              if (this.isRoot) {',\r
+'                                      if (isIe) {',\r
+'                                              this.contentDiv = logMainContainer.appendChild(document.createElement("div"));',\r
+'                                              this.contentDiv.id = this.isWrapped ? "log_wrapped" : "log_unwrapped";',\r
+'                                      } else {',\r
+'                                              this.contentDiv = logMainContainer;',\r
+'                                      }',\r
+'                              } else {',\r
+'                                      var groupElementContainer = this;',\r
+'                                      ',\r
+'                                      this.mainDiv = document.createElement("div");',\r
+'                                      this.mainDiv.className = "group";',\r
+'',\r
+'                                      this.headingDiv = this.mainDiv.appendChild(document.createElement("div"));',\r
+'                                      this.headingDiv.className = "groupheading";',\r
+'',\r
+'                                      this.expander = this.headingDiv.appendChild(document.createElement("span"));',\r
+'                                      this.expander.className = "expander unselectable greyedout";',\r
+'                                      this.expander.unselectable = true;',\r
+'                                      var expanderText = this.group.expanded ? "-" : "+";',\r
+'                                      this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));',\r
+'                                      ',\r
+'                                      this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));',\r
+'',\r
+'                                      this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));',\r
+'                                      var contentCssClass = this.group.expanded ? "expanded" : "collapsed";',\r
+'                                      this.contentDiv.className = "groupcontent " + contentCssClass;',\r
+'',\r
+'                                      this.expander.onclick = function() {',\r
+'                                              if (groupElementContainer.group.expandable) {',\r
+'                                                      groupElementContainer.group.toggleExpanded();',\r
+'                                              }',\r
+'                                      };',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      GroupElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      copyProperties(GroupElementContainer.prototype, {',\r
+'                              toggleExpanded: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              var oldCssClass, newCssClass, expanderText;',\r
+'                                              if (this.group.expanded) {',\r
+'                                                      newCssClass = "expanded";',\r
+'                                                      oldCssClass = "collapsed";',\r
+'                                                      expanderText = "-";',\r
+'                                              } else {',\r
+'                                                      newCssClass = "collapsed";',\r
+'                                                      oldCssClass = "expanded";',\r
+'                                                      expanderText = "+";',\r
+'                                              }',\r
+'                                              replaceClass(this.contentDiv, newCssClass, oldCssClass);',\r
+'                                              this.expanderTextNode.nodeValue = expanderText;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              this.headingDiv = null;',\r
+'                                              this.expander.onclick = null;',\r
+'                                              this.expander = null;',\r
+'                                              this.expanderTextNode = null;',\r
+'                                              this.contentDiv = null;',\r
+'                                              this.containerDomNode = null;',\r
+'                                              this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                                              this.mainDiv = null;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              reverseChildren: function() {',\r
+'                                      // Invert the order of the log entries',\r
+'                                      var node = null;',\r
+'',\r
+'                                      // Remove all the log container nodes',\r
+'                                      var childDomNodes = [];',\r
+'                                      while ((node = this.contentDiv.firstChild)) {',\r
+'                                              this.contentDiv.removeChild(node);',\r
+'                                              childDomNodes.push(node);',\r
+'                                      }',\r
+'',\r
+'                                      // Put them all back in reverse order',\r
+'                                      while ((node = childDomNodes.pop())) {',\r
+'                                              this.contentDiv.appendChild(node);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              update: function() {',\r
+'                                      if (!this.isRoot) {',\r
+'                                              if (this.group.expandable) {',\r
+'                                                      removeClass(this.expander, "greyedout");',\r
+'                                              } else {',\r
+'                                                      addClass(this.expander, "greyedout");',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clear: function() {',\r
+'                                      if (this.isRoot) {',\r
+'                                              this.contentDiv.innerHTML = "";',\r
+'                                      }',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function Group(name, isRoot, initiallyExpanded) {',\r
+'                              this.name = name;',\r
+'                              this.group = null;',\r
+'                              this.isRoot = isRoot;',\r
+'                              this.initiallyExpanded = initiallyExpanded;',\r
+'                              this.elementContainers = [];',\r
+'                              this.children = [];',\r
+'                              this.expanded = initiallyExpanded;',\r
+'                              this.rendered = false;',\r
+'                              this.expandable = false;',\r
+'                      }',\r
+'',\r
+'                      Group.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(Group.prototype, {',\r
+'                              addChild: function(logItem) {',\r
+'                                      this.children.push(logItem);',\r
+'                                      logItem.group = this;',\r
+'                              },',\r
+'',\r
+'                              render: function() {',\r
+'                                      if (isIe) {',\r
+'                                              var unwrappedDomContainer, wrappedDomContainer;',\r
+'                                              if (this.isRoot) {',\r
+'                                                      unwrappedDomContainer = logMainContainer;',\r
+'                                                      wrappedDomContainer = logMainContainer;',\r
+'                                              } else {',\r
+'                                                      unwrappedDomContainer = this.getUnwrappedDomContainer();',\r
+'                                                      wrappedDomContainer = this.getWrappedDomContainer();',\r
+'                                              }',\r
+'                                              this.unwrappedElementContainer = new GroupElementContainer(this, unwrappedDomContainer, this.isRoot, false);',\r
+'                                              this.wrappedElementContainer = new GroupElementContainer(this, wrappedDomContainer, this.isRoot, true);',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              var mainDomContainer = this.isRoot ? logMainContainer : this.getMainDomContainer();',\r
+'                                              this.mainElementContainer = new GroupElementContainer(this, mainDomContainer, this.isRoot, false);',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.rendered = true;',\r
+'                              },',\r
+'',\r
+'                              toggleExpanded: function() {',\r
+'                                      this.expanded = !this.expanded;',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].toggleExpanded();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              expand: function() {',\r
+'                                      if (!this.expanded) {',\r
+'                                              this.toggleExpanded();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visitGroup(this);',\r
+'                              },',\r
+'',\r
+'                              reverseChildren: function() {',\r
+'                                      if (this.rendered) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].reverseChildren();',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              update: function() {',\r
+'                                      var previouslyExpandable = this.expandable;',\r
+'                                      this.expandable = (this.children.length !== 0);',\r
+'                                      if (this.expandable !== previouslyExpandable) {',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].update();',\r
+'                                              }',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              flatten: function() {',\r
+'                                      var visitor = new GroupFlattener();',\r
+'                                      this.accept(visitor);',\r
+'                                      return visitor.logEntriesAndSeparators;',\r
+'                              },',\r
+'',\r
+'                              removeChild: function(child, doUpdate) {',\r
+'                                      array_remove(this.children, child);',\r
+'                                      child.group = null;',\r
+'                                      if (doUpdate) {',\r
+'                                              this.update();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              remove: function(doUpdate, removeFromGroup) {',\r
+'                                      for (var i = 0, len = this.children.length; i < len; i++) {',\r
+'                                              this.children[i].remove(false, false);',\r
+'                                      }',\r
+'                                      this.children = [];',\r
+'                                      this.update();',\r
+'                                      if (this === currentGroup) {',\r
+'                                              currentGroup = this.group;',\r
+'                                      }',\r
+'                                      this.doRemove(doUpdate, removeFromGroup);',\r
+'                              },',\r
+'',\r
+'                              serialize: function(items) {',\r
+'                                      items.push([LogItem.serializedItemKeys.GROUP_START, this.name]);',\r
+'                                      for (var i = 0, len = this.children.length; i < len; i++) {',\r
+'                                              this.children[i].serialize(items);',\r
+'                                      }',\r
+'                                      if (this !== currentGroup) {',\r
+'                                              items.push([LogItem.serializedItemKeys.GROUP_END]);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clear: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].clear();',\r
+'                                      }',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryElementContainer() {',\r
+'                      }',\r
+'',\r
+'                      LogEntryElementContainer.prototype = new LogItemContainerElement();',\r
+'',\r
+'                      copyProperties(LogEntryElementContainer.prototype, {',\r
+'                              remove: function() {',\r
+'                                      this.doRemove();',\r
+'                              },',\r
+'',\r
+'                              doRemove: function() {',\r
+'                                      this.mainDiv.parentNode.removeChild(this.mainDiv);',\r
+'                                      this.mainDiv = null;',\r
+'                                      this.contentElement = null;',\r
+'                                      this.containerDomNode = null;',\r
+'                              },',\r
+'',\r
+'                              setContent: function(content, wrappedContent) {',\r
+'                                      if (content === this.formattedMessage) {',\r
+'                                              this.contentElement.innerHTML = "";',\r
+'                                              this.contentElement.appendChild(document.createTextNode(this.formattedMessage));',\r
+'                                      } else {',\r
+'                                              this.contentElement.innerHTML = content;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              setSearchMatch: function(isMatch) {',\r
+'                                      var oldCssClass = isMatch ? "searchnonmatch" : "searchmatch";',\r
+'                                      var newCssClass = isMatch ? "searchmatch" : "searchnonmatch";',\r
+'                                      replaceClass(this.mainDiv, newCssClass, oldCssClass);',\r
+'                              },',\r
+'',\r
+'                              clearSearch: function() {',\r
+'                                      removeClass(this.mainDiv, "searchmatch");',\r
+'                                      removeClass(this.mainDiv, "searchnonmatch");',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryWrappedElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                              this.mainDiv.className = "logentry wrapped " + this.logEntry.level;',\r
+'                              this.contentElement = this.mainDiv;',\r
+'                      }',\r
+'',\r
+'                      LogEntryWrappedElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      LogEntryWrappedElementContainer.prototype.setContent = function(content, wrappedContent) {',\r
+'                              if (content === this.formattedMessage) {',\r
+'                                      this.contentElement.innerHTML = "";',\r
+'                                      this.contentElement.appendChild(document.createTextNode(this.formattedMessage));',\r
+'                              } else {',\r
+'                                      this.contentElement.innerHTML = wrappedContent;',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryUnwrappedElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "logentry unwrapped " + this.logEntry.level;',\r
+'                              this.pre = this.mainDiv.appendChild(document.createElement("pre"));',\r
+'                              this.pre.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                              this.pre.className = "unwrapped";',\r
+'                              this.contentElement = this.pre;',\r
+'                      }',\r
+'',\r
+'                      LogEntryUnwrappedElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      LogEntryUnwrappedElementContainer.prototype.remove = function() {',\r
+'                              this.doRemove();',\r
+'                              this.pre = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntryMainElementContainer(logEntry, containerDomNode) {',\r
+'                              this.logEntry = logEntry;',\r
+'                              this.containerDomNode = containerDomNode;',\r
+'                              this.mainDiv = document.createElement("div");',\r
+'                              this.mainDiv.className = "logentry nonielogentry " + this.logEntry.level;',\r
+'                              this.contentElement = this.mainDiv.appendChild(document.createElement("span"));',\r
+'                              this.contentElement.appendChild(document.createTextNode(this.logEntry.formattedMessage));',\r
+'                      }',\r
+'',\r
+'                      LogEntryMainElementContainer.prototype = new LogEntryElementContainer();',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogEntry(level, formattedMessage) {',\r
+'                              this.level = level;',\r
+'                              this.formattedMessage = formattedMessage;',\r
+'                              this.rendered = false;',\r
+'                      }',\r
+'',\r
+'                      LogEntry.prototype = new LogItem();',\r
+'',\r
+'                      copyProperties(LogEntry.prototype, {',\r
+'                              render: function() {',\r
+'                                      var logEntry = this;',\r
+'                                      var containerDomNode = this.group.contentDiv;',\r
+'',\r
+'                                      // Support for the CSS attribute white-space in IE for Windows is',\r
+'                                      // non-existent pre version 6 and slightly odd in 6, so instead',\r
+'                                      // use two different HTML elements',\r
+'                                      if (isIe) {',\r
+'                                              this.formattedMessage = this.formattedMessage.replace(/\\r\\n/g, "\\r"); // Workaround for IE\'s treatment of white space',\r
+'                                              this.unwrappedElementContainer = new LogEntryUnwrappedElementContainer(this, this.getUnwrappedDomContainer());',\r
+'                                              this.wrappedElementContainer = new LogEntryWrappedElementContainer(this, this.getWrappedDomContainer());',\r
+'                                              this.elementContainers = [this.unwrappedElementContainer, this.wrappedElementContainer];',\r
+'                                      } else {',\r
+'                                              this.mainElementContainer = new LogEntryMainElementContainer(this, this.getMainDomContainer());',\r
+'                                              this.elementContainers = [this.mainElementContainer];',\r
+'                                      }',\r
+'                                      this.content = this.formattedMessage;',\r
+'                                      this.rendered = true;',\r
+'                              },',\r
+'',\r
+'                              setContent: function(content, wrappedContent) {',\r
+'                                      if (content != this.content) {',\r
+'                                              if (isIe && (content !== this.formattedMessage)) {',\r
+'                                                      content = content.replace(/\\r\\n/g, "\\r"); // Workaround for IE\'s treatment of white space',\r
+'                                              }',\r
+'                                              for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                                      this.elementContainers[i].setContent(content, wrappedContent);',\r
+'                                              }',\r
+'                                              this.content = content;',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              getSearchMatches: function() {',\r
+'                                      var matches = [];',\r
+'                                      var i, len;',\r
+'                                      if (isIe) {',\r
+'                                              var unwrappedEls = getElementsByClass(this.unwrappedElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              var wrappedEls = getElementsByClass(this.wrappedElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              for (i = 0, len = unwrappedEls.length; i < len; i++) {',\r
+'                                                      matches[i] = new Match(this.level, null, unwrappedEls[i], wrappedEls[i]);',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              var els = getElementsByClass(this.mainElementContainer.mainDiv, "searchterm", "span");',\r
+'                                              for (i = 0, len = els.length; i < len; i++) {',\r
+'                                                      matches[i] = new Match(this.level, els[i]);',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return matches;',\r
+'                              },',\r
+'',\r
+'                              setSearchMatch: function(isMatch) {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].setSearchMatch(isMatch);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              clearSearch: function() {',\r
+'                                      for (var i = 0, len = this.elementContainers.length; i < len; i++) {',\r
+'                                              this.elementContainers[i].clearSearch();',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              accept: function(visitor) {',\r
+'                                      visitor.visitLogEntry(this);',\r
+'                              },',\r
+'',\r
+'                              serialize: function(items) {',\r
+'                                      items.push([LogItem.serializedItemKeys.LOG_ENTRY, this.level, this.formattedMessage]);',\r
+'                              }',\r
+'                      });',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemVisitor() {',\r
+'                      }',\r
+'',\r
+'                      LogItemVisitor.prototype = {',\r
+'                              visit: function(logItem) {',\r
+'                              },',\r
+'',\r
+'                              visitParent: function(logItem) {',\r
+'                                      if (logItem.group) {',\r
+'                                              logItem.group.accept(this);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              visitChildren: function(logItem) {',\r
+'                                      for (var i = 0, len = logItem.children.length; i < len; i++) {',\r
+'                                              logItem.children[i].accept(this);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              visitLogEntry: function(logEntry) {',\r
+'                                      this.visit(logEntry);',\r
+'                              },',\r
+'',\r
+'                              visitSeparator: function(separator) {',\r
+'                                      this.visit(separator);',\r
+'                              },',\r
+'',\r
+'                              visitGroup: function(group) {',\r
+'                                      this.visit(group);',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function GroupFlattener() {',\r
+'                              this.logEntriesAndSeparators = [];',\r
+'                      }',\r
+'',\r
+'                      GroupFlattener.prototype = new LogItemVisitor();',\r
+'',\r
+'                      GroupFlattener.prototype.visitGroup = function(group) {',\r
+'                              this.visitChildren(group);',\r
+'                      };',\r
+'',\r
+'                      GroupFlattener.prototype.visitLogEntry = function(logEntry) {',\r
+'                              this.logEntriesAndSeparators.push(logEntry);',\r
+'                      };',\r
+'',\r
+'                      GroupFlattener.prototype.visitSeparator = function(separator) {',\r
+'                              this.logEntriesAndSeparators.push(separator);',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      window.onload = function() {',\r
+'                              // Sort out document.domain',\r
+'                              if (location.search) {',\r
+'                                      var queryBits = unescape(location.search).substr(1).split("&"), nameValueBits;',\r
+'                                      for (var i = 0, len = queryBits.length; i < len; i++) {',\r
+'                                              nameValueBits = queryBits[i].split("=");',\r
+'                                              if (nameValueBits[0] == "log4javascript_domain") {',\r
+'                                                      document.domain = nameValueBits[1];',\r
+'                                                      break;',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'',\r
+'                              // Create DOM objects',\r
+'                              logMainContainer = $("log");',\r
+'                              if (isIePre7) {',\r
+'                                      addClass(logMainContainer, "oldIe");',\r
+'                              }',\r
+'',\r
+'                              rootGroup = new Group("root", true);',\r
+'                              rootGroup.render();',\r
+'                              currentGroup = rootGroup;',\r
+'                              ',\r
+'                              setCommandInputWidth();',\r
+'                              setLogContainerHeight();',\r
+'                              toggleLoggingEnabled();',\r
+'                              toggleSearchEnabled();',\r
+'                              toggleSearchFilter();',\r
+'                              toggleSearchHighlight();',\r
+'                              applyFilters();',\r
+'                              checkAllLevels();',\r
+'                              toggleWrap();',\r
+'                              toggleNewestAtTop();',\r
+'                              toggleScrollToLatest();',\r
+'                              renderQueuedLogItems();',\r
+'                              loaded = true;',\r
+'                              $("command").value = "";',\r
+'                              $("command").autocomplete = "off";',\r
+'                              $("command").onkeydown = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 10 || evt.keyCode == 13) { // Return/Enter',\r
+'                                              evalCommandLine();',\r
+'                                              stopPropagation(evt);',\r
+'                                      } else if (evt.keyCode == 27) { // Escape',\r
+'                                              this.value = "";',\r
+'                                              this.focus();',\r
+'                                      } else if (evt.keyCode == 38 && commandHistory.length > 0) { // Up',\r
+'                                              currentCommandIndex = Math.max(0, currentCommandIndex - 1);',\r
+'                                              this.value = commandHistory[currentCommandIndex];',\r
+'                                              moveCaretToEnd(this);',\r
+'                                      } else if (evt.keyCode == 40 && commandHistory.length > 0) { // Down',\r
+'                                              currentCommandIndex = Math.min(commandHistory.length - 1, currentCommandIndex + 1);',\r
+'                                              this.value = commandHistory[currentCommandIndex];',\r
+'                                              moveCaretToEnd(this);',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Prevent the keypress moving the caret in Firefox',\r
+'                              $("command").onkeypress = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 38 && commandHistory.length > 0 && evt.preventDefault) { // Up',\r
+'                                              evt.preventDefault();',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Prevent the keyup event blurring the input in Opera',\r
+'                              $("command").onkeyup = function(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      if (evt.keyCode == 27 && evt.preventDefault) { // Up',\r
+'                                              evt.preventDefault();',\r
+'                                              this.focus();',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Add document keyboard shortcuts',\r
+'                              document.onkeydown = function keyEventHandler(evt) {',\r
+'                                      evt = getEvent(evt);',\r
+'                                      switch (evt.keyCode) {',\r
+'                                              case 69: // Ctrl + shift + E: re-execute last command',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              evalLastCommand();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                              case 75: // Ctrl + shift + K: focus search',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              focusSearch();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                              case 40: // Ctrl + shift + down arrow: focus command line',\r
+'                                              case 76: // Ctrl + shift + L: focus command line',\r
+'                                                      if (evt.shiftKey && (evt.ctrlKey || evt.metaKey)) {',\r
+'                                                              focusCommandLine();',\r
+'                                                              cancelKeyEvent(evt);',\r
+'                                                              return false;',\r
+'                                                      }',\r
+'                                                      break;',\r
+'                                      }',\r
+'                              };',\r
+'',\r
+'                              // Workaround to make sure log div starts at the correct size',\r
+'                              setTimeout(setLogContainerHeight, 20);',\r
+'',\r
+'                              setShowCommandLine(showCommandLine);',\r
+'                              doSearch();',\r
+'                      };',\r
+'',\r
+'                      window.onunload = function() {',\r
+'                              if (mainWindowExists()) {',\r
+'                                      appender.unload();',\r
+'                              }',\r
+'                              appender = null;',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function toggleLoggingEnabled() {',\r
+'                              setLoggingEnabled($("enableLogging").checked);',\r
+'                      }',\r
+'',\r
+'                      function setLoggingEnabled(enable) {',\r
+'                              loggingEnabled = enable;',\r
+'                      }',\r
+'',\r
+'                      var appender = null;',\r
+'',\r
+'                      function setAppender(appenderParam) {',\r
+'                              appender = appenderParam;',\r
+'                      }',\r
+'',\r
+'                      function setShowCloseButton(showCloseButton) {',\r
+'                              $("closeButton").style.display = showCloseButton ? "inline" : "none";',\r
+'                      }',\r
+'',\r
+'                      function setShowHideButton(showHideButton) {',\r
+'                              $("hideButton").style.display = showHideButton ? "inline" : "none";',\r
+'                      }',\r
+'',\r
+'                      var newestAtTop = false;',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function LogItemContentReverser() {',\r
+'                      }',\r
+'                      ',\r
+'                      LogItemContentReverser.prototype = new LogItemVisitor();',\r
+'                      ',\r
+'                      LogItemContentReverser.prototype.visitGroup = function(group) {',\r
+'                              group.reverseChildren();',\r
+'                              this.visitChildren(group);',\r
+'                      };',\r
+'',\r
+'                      /*----------------------------------------------------------------*/',\r
+'',\r
+'                      function setNewestAtTop(isNewestAtTop) {',\r
+'                              var oldNewestAtTop = newestAtTop;',\r
+'                              var i, iLen, j, jLen;',\r
+'                              newestAtTop = Boolean(isNewestAtTop);',\r
+'                              if (oldNewestAtTop != newestAtTop) {',\r
+'                                      var visitor = new LogItemContentReverser();',\r
+'                                      rootGroup.accept(visitor);',\r
+'',\r
+'                                      // Reassemble the matches array',\r
+'                                      if (currentSearch) {',\r
+'                                              var currentMatch = currentSearch.matches[currentMatchIndex];',\r
+'                                              var matchIndex = 0;',\r
+'                                              var matches = [];',\r
+'                                              var actOnLogEntry = function(logEntry) {',\r
+'                                                      var logEntryMatches = logEntry.getSearchMatches();',\r
+'                                                      for (j = 0, jLen = logEntryMatches.length; j < jLen; j++) {',\r
+'                                                              matches[matchIndex] = logEntryMatches[j];',\r
+'                                                              if (currentMatch && logEntryMatches[j].equals(currentMatch)) {',\r
+'                                                                      currentMatchIndex = matchIndex;',\r
+'                                                              }',\r
+'                                                              matchIndex++;',\r
+'                                                      }',\r
+'                                              };',\r
+'                                              if (newestAtTop) {',\r
+'                                                      for (i = logEntries.length - 1; i >= 0; i--) {',\r
+'                                                              actOnLogEntry(logEntries[i]);',\r
+'                                                      }',\r
+'                                              } else {',\r
+'                                                      for (i = 0, iLen = logEntries.length; i < iLen; i++) {',\r
+'                                                              actOnLogEntry(logEntries[i]);',\r
+'                                                      }',\r
+'                                              }',\r
+'                                              currentSearch.matches = matches;',\r
+'                                              if (currentMatch) {',\r
+'                                                      currentMatch.setCurrent();',\r
+'                                              }',\r
+'                                      } else if (scrollToLatest) {',\r
+'                                              doScrollToLatest();',\r
+'                                      }',\r
+'                              }',\r
+'                              $("newestAtTop").checked = isNewestAtTop;',\r
+'                      }',\r
+'',\r
+'                      function toggleNewestAtTop() {',\r
+'                              var isNewestAtTop = $("newestAtTop").checked;',\r
+'                              setNewestAtTop(isNewestAtTop);',\r
+'                      }',\r
+'',\r
+'                      var scrollToLatest = true;',\r
+'',\r
+'                      function setScrollToLatest(isScrollToLatest) {',\r
+'                              scrollToLatest = isScrollToLatest;',\r
+'                              if (scrollToLatest) {',\r
+'                                      doScrollToLatest();',\r
+'                              }',\r
+'                              $("scrollToLatest").checked = isScrollToLatest;',\r
+'                      }',\r
+'',\r
+'                      function toggleScrollToLatest() {',\r
+'                              var isScrollToLatest = $("scrollToLatest").checked;',\r
+'                              setScrollToLatest(isScrollToLatest);',\r
+'                      }',\r
+'',\r
+'                      function doScrollToLatest() {',\r
+'                              var l = logMainContainer;',\r
+'                              if (typeof l.scrollTop != "undefined") {',\r
+'                                      if (newestAtTop) {',\r
+'                                              l.scrollTop = 0;',\r
+'                                      } else {',\r
+'                                              var latestLogEntry = l.lastChild;',\r
+'                                              if (latestLogEntry) {',\r
+'                                                      l.scrollTop = l.scrollHeight;',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var closeIfOpenerCloses = true;',\r
+'',\r
+'                      function setCloseIfOpenerCloses(isCloseIfOpenerCloses) {',\r
+'                              closeIfOpenerCloses = isCloseIfOpenerCloses;',\r
+'                      }',\r
+'',\r
+'                      var maxMessages = null;',\r
+'',\r
+'                      function setMaxMessages(max) {',\r
+'                              maxMessages = max;',\r
+'                              pruneLogEntries();',\r
+'                      }',\r
+'',\r
+'                      var showCommandLine = false;',\r
+'',\r
+'                      function setShowCommandLine(isShowCommandLine) {',\r
+'                              showCommandLine = isShowCommandLine;',\r
+'                              if (loaded) {',\r
+'                                      $("commandLine").style.display = showCommandLine ? "block" : "none";',\r
+'                                      setCommandInputWidth();',\r
+'                                      setLogContainerHeight();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function focusCommandLine() {',\r
+'                              if (loaded) {',\r
+'                                      $("command").focus();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function focusSearch() {',\r
+'                              if (loaded) {',\r
+'                                      $("searchBox").focus();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function getLogItems() {',\r
+'                              var items = [];',\r
+'                              for (var i = 0, len = logItems.length; i < len; i++) {',\r
+'                                      logItems[i].serialize(items);',\r
+'                              }',\r
+'                              return items;',\r
+'                      }',\r
+'',\r
+'                      function setLogItems(items) {',\r
+'                              var loggingReallyEnabled = loggingEnabled;',\r
+'                              // Temporarily turn logging on',\r
+'                              loggingEnabled = true;',\r
+'                              for (var i = 0, len = items.length; i < len; i++) {',\r
+'                                      switch (items[i][0]) {',\r
+'                                              case LogItem.serializedItemKeys.LOG_ENTRY:',\r
+'                                                      log(items[i][1], items[i][2]);',\r
+'                                                      break;',\r
+'                                              case LogItem.serializedItemKeys.GROUP_START:',\r
+'                                                      group(items[i][1]);',\r
+'                                                      break;',\r
+'                                              case LogItem.serializedItemKeys.GROUP_END:',\r
+'                                                      groupEnd();',\r
+'                                                      break;',\r
+'                                      }',\r
+'                              }',\r
+'                              loggingEnabled = loggingReallyEnabled;',\r
+'                      }',\r
+'',\r
+'                      function log(logLevel, formattedMessage) {',\r
+'                              if (loggingEnabled) {',\r
+'                                      var logEntry = new LogEntry(logLevel, formattedMessage);',\r
+'                                      logEntries.push(logEntry);',\r
+'                                      logEntriesAndSeparators.push(logEntry);',\r
+'                                      logItems.push(logEntry);',\r
+'                                      currentGroup.addChild(logEntry);',\r
+'                                      if (loaded) {',\r
+'                                              if (logQueuedEventsTimer !== null) {',\r
+'                                                      clearTimeout(logQueuedEventsTimer);',\r
+'                                              }',\r
+'                                              logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);',\r
+'                                              unrenderedLogItemsExist = true;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function renderQueuedLogItems() {',\r
+'                              logQueuedEventsTimer = null;',\r
+'                              var pruned = pruneLogEntries();',\r
+'',\r
+'                              // Render any unrendered log entries and apply the current search to them',\r
+'                              var initiallyHasMatches = currentSearch ? currentSearch.hasMatches() : false;',\r
+'                              for (var i = 0, len = logItems.length; i < len; i++) {',\r
+'                                      if (!logItems[i].rendered) {',\r
+'                                              logItems[i].render();',\r
+'                                              logItems[i].appendToLog();',\r
+'                                              if (currentSearch && (logItems[i] instanceof LogEntry)) {',\r
+'                                                      currentSearch.applyTo(logItems[i]);',\r
+'                                              }',\r
+'                                      }',\r
+'                              }',\r
+'                              if (currentSearch) {',\r
+'                                      if (pruned) {',\r
+'                                              if (currentSearch.hasVisibleMatches()) {',\r
+'                                                      if (currentMatchIndex === null) {',\r
+'                                                              setCurrentMatchIndex(0);',\r
+'                                                      }',\r
+'                                                      displayMatches();',\r
+'                                              } else {',\r
+'                                                      displayNoMatches();',\r
+'                                              }',\r
+'                                      } else if (!initiallyHasMatches && currentSearch.hasVisibleMatches()) {',\r
+'                                              setCurrentMatchIndex(0);',\r
+'                                              displayMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                              if (scrollToLatest) {',\r
+'                                      doScrollToLatest();',\r
+'                              }',\r
+'                              unrenderedLogItemsExist = false;',\r
+'                      }',\r
+'',\r
+'                      function pruneLogEntries() {',\r
+'                              if ((maxMessages !== null) && (logEntriesAndSeparators.length > maxMessages)) {',\r
+'                                      var numberToDelete = logEntriesAndSeparators.length - maxMessages;',\r
+'                                      var prunedLogEntries = logEntriesAndSeparators.slice(0, numberToDelete);',\r
+'                                      if (currentSearch) {',\r
+'                                              currentSearch.removeMatches(prunedLogEntries);',\r
+'                                      }',\r
+'                                      var group;',\r
+'                                      for (var i = 0; i < numberToDelete; i++) {',\r
+'                                              group = logEntriesAndSeparators[i].group;',\r
+'                                              array_remove(logItems, logEntriesAndSeparators[i]);',\r
+'                                              array_remove(logEntries, logEntriesAndSeparators[i]);',\r
+'                                              logEntriesAndSeparators[i].remove(true, true);',\r
+'                                              if (group.children.length === 0 && group !== currentGroup && group !== rootGroup) {',\r
+'                                                      array_remove(logItems, group);',\r
+'                                                      group.remove(true, true);',\r
+'                                              }',\r
+'                                      }',\r
+'                                      logEntriesAndSeparators = array_removeFromStart(logEntriesAndSeparators, numberToDelete);',\r
+'                                      return true;',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function group(name, startExpanded) {',\r
+'                              if (loggingEnabled) {',\r
+'                                      initiallyExpanded = (typeof startExpanded === "undefined") ? true : Boolean(startExpanded);',\r
+'                                      var newGroup = new Group(name, false, initiallyExpanded);',\r
+'                                      currentGroup.addChild(newGroup);',\r
+'                                      currentGroup = newGroup;',\r
+'                                      logItems.push(newGroup);',\r
+'                                      if (loaded) {',\r
+'                                              if (logQueuedEventsTimer !== null) {',\r
+'                                                      clearTimeout(logQueuedEventsTimer);',\r
+'                                              }',\r
+'                                              logQueuedEventsTimer = setTimeout(renderQueuedLogItems, renderDelay);',\r
+'                                              unrenderedLogItemsExist = true;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function groupEnd() {',\r
+'                              currentGroup = (currentGroup === rootGroup) ? rootGroup : currentGroup.group;',\r
+'                      }',\r
+'',\r
+'                      function mainPageReloaded() {',\r
+'                              currentGroup = rootGroup;',\r
+'                              var separator = new Separator();',\r
+'                              logEntriesAndSeparators.push(separator);',\r
+'                              logItems.push(separator);',\r
+'                              currentGroup.addChild(separator);',\r
+'                      }',\r
+'',\r
+'                      function closeWindow() {',\r
+'                              if (appender && mainWindowExists()) {',\r
+'                                      appender.close(true);',\r
+'                              } else {',\r
+'                                      window.close();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function hide() {',\r
+'                              if (appender && mainWindowExists()) {',\r
+'                                      appender.hide();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var mainWindow = window;',\r
+'                      var windowId = "log4javascriptConsoleWindow_" + new Date().getTime() + "_" + ("" + Math.random()).substr(2);',\r
+'',\r
+'                      function setMainWindow(win) {',\r
+'                              mainWindow = win;',\r
+'                              mainWindow[windowId] = window;',\r
+'                              // If this is a pop-up, poll the opener to see if it\'s closed',\r
+'                              if (opener && closeIfOpenerCloses) {',\r
+'                                      pollOpener();',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function pollOpener() {',\r
+'                              if (closeIfOpenerCloses) {',\r
+'                                      if (mainWindowExists()) {',\r
+'                                              setTimeout(pollOpener, 500);',\r
+'                                      } else {',\r
+'                                              closeWindow();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function mainWindowExists() {',\r
+'                              try {',\r
+'                                      return (mainWindow && !mainWindow.closed &&',\r
+'                                              mainWindow[windowId] == window);',\r
+'                              } catch (ex) {}',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      var logLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];',\r
+'',\r
+'                      function getCheckBox(logLevel) {',\r
+'                              return $("switch_" + logLevel);',\r
+'                      }',\r
+'',\r
+'                      function getIeWrappedLogContainer() {',\r
+'                              return $("log_wrapped");',\r
+'                      }',\r
+'',\r
+'                      function getIeUnwrappedLogContainer() {',\r
+'                              return $("log_unwrapped");',\r
+'                      }',\r
+'',\r
+'                      function applyFilters() {',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      if (getCheckBox(logLevels[i]).checked) {',\r
+'                                              addClass(logMainContainer, logLevels[i]);',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, logLevels[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                              updateSearchFromFilters();',\r
+'                      }',\r
+'',\r
+'                      function toggleAllLevels() {',\r
+'                              var turnOn = $("switch_ALL").checked;',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      getCheckBox(logLevels[i]).checked = turnOn;',\r
+'                                      if (turnOn) {',\r
+'                                              addClass(logMainContainer, logLevels[i]);',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, logLevels[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function checkAllLevels() {',\r
+'                              for (var i = 0; i < logLevels.length; i++) {',\r
+'                                      if (!getCheckBox(logLevels[i]).checked) {',\r
+'                                              getCheckBox("ALL").checked = false;',\r
+'                                              return;',\r
+'                                      }',\r
+'                              }',\r
+'                              getCheckBox("ALL").checked = true;',\r
+'                      }',\r
+'',\r
+'                      function clearLog() {',\r
+'                              rootGroup.clear();',\r
+'                              currentGroup = rootGroup;',\r
+'                              logEntries = [];',\r
+'                              logItems = [];',\r
+'                              logEntriesAndSeparators = [];',\r
+'                              doSearch();',\r
+'                      }',\r
+'',\r
+'                      function toggleWrap() {',\r
+'                              var enable = $("wrap").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "wrap");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "wrap");',\r
+'                              }',\r
+'                              refreshCurrentMatch();',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------- */',\r
+'',\r
+'                      // Search',\r
+'',\r
+'                      var searchTimer = null;',\r
+'',\r
+'                      function scheduleSearch() {',\r
+'                              try {',\r
+'                                      clearTimeout(searchTimer);',\r
+'                              } catch (ex) {',\r
+'                                      // Do nothing',\r
+'                              }',\r
+'                              searchTimer = setTimeout(doSearch, 500);',\r
+'                      }',\r
+'',\r
+'                      function Search(searchTerm, isRegex, searchRegex, isCaseSensitive) {',\r
+'                              this.searchTerm = searchTerm;',\r
+'                              this.isRegex = isRegex;',\r
+'                              this.searchRegex = searchRegex;',\r
+'                              this.isCaseSensitive = isCaseSensitive;',\r
+'                              this.matches = [];',\r
+'                      }',\r
+'',\r
+'                      Search.prototype = {',\r
+'                              hasMatches: function() {',\r
+'                                      return this.matches.length > 0;',\r
+'                              },',\r
+'',\r
+'                              hasVisibleMatches: function() {',\r
+'                                      if (this.hasMatches()) {',\r
+'                                              for (var i = 0; i < this.matches.length; i++) {',\r
+'                                                      if (this.matches[i].isVisible()) {',\r
+'                                                              return true;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return false;',\r
+'                              },',\r
+'',\r
+'                              match: function(logEntry) {',\r
+'                                      var entryText = String(logEntry.formattedMessage);',\r
+'                                      var matchesSearch = false;',\r
+'                                      if (this.isRegex) {',\r
+'                                              matchesSearch = this.searchRegex.test(entryText);',\r
+'                                      } else if (this.isCaseSensitive) {',\r
+'                                              matchesSearch = (entryText.indexOf(this.searchTerm) > -1);',\r
+'                                      } else {',\r
+'                                              matchesSearch = (entryText.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);',\r
+'                                      }',\r
+'                                      return matchesSearch;',\r
+'                              },',\r
+'',\r
+'                              getNextVisibleMatchIndex: function() {',\r
+'                                      for (var i = currentMatchIndex + 1; i < this.matches.length; i++) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      // Start again from the first match',\r
+'                                      for (i = 0; i <= currentMatchIndex; i++) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return -1;',\r
+'                              },',\r
+'',\r
+'                              getPreviousVisibleMatchIndex: function() {',\r
+'                                      for (var i = currentMatchIndex - 1; i >= 0; i--) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      // Start again from the last match',\r
+'                                      for (var i = this.matches.length - 1; i >= currentMatchIndex; i--) {',\r
+'                                              if (this.matches[i].isVisible()) {',\r
+'                                                      return i;',\r
+'                                              }',\r
+'                                      }',\r
+'                                      return -1;',\r
+'                              },',\r
+'',\r
+'                              applyTo: function(logEntry) {',\r
+'                                      var doesMatch = this.match(logEntry);',\r
+'                                      if (doesMatch) {',\r
+'                                              logEntry.group.expand();',\r
+'                                              logEntry.setSearchMatch(true);',\r
+'                                              var logEntryContent;',\r
+'                                              var wrappedLogEntryContent;',\r
+'                                              var searchTermReplacementStartTag = "<span class=\\\"searchterm\\\">";',\r
+'                                              var searchTermReplacementEndTag = "<" + "/span>";',\r
+'                                              var preTagName = isIe ? "pre" : "span";',\r
+'                                              var preStartTag = "<" + preTagName + " class=\\\"pre\\\">";',\r
+'                                              var preEndTag = "<" + "/" + preTagName + ">";',\r
+'                                              var startIndex = 0;',\r
+'                                              var searchIndex, matchedText, textBeforeMatch;',\r
+'                                              if (this.isRegex) {',\r
+'                                                      var flags = this.isCaseSensitive ? "g" : "gi";',\r
+'                                                      var capturingRegex = new RegExp("(" + this.searchRegex.source + ")", flags);',\r
+'',\r
+'                                                      // Replace the search term with temporary tokens for the start and end tags',\r
+'                                                      var rnd = ("" + Math.random()).substr(2);',\r
+'                                                      var startToken = "%%s" + rnd + "%%";',\r
+'                                                      var endToken = "%%e" + rnd + "%%";',\r
+'                                                      logEntryContent = logEntry.formattedMessage.replace(capturingRegex, startToken + "$1" + endToken);',\r
+'',\r
+'                                                      // Escape the HTML to get rid of angle brackets',\r
+'                                                      logEntryContent = escapeHtml(logEntryContent);',\r
+'',\r
+'                                                      // Substitute the proper HTML back in for the search match',\r
+'                                                      var result;',\r
+'                                                      var searchString = logEntryContent;',\r
+'                                                      logEntryContent = "";',\r
+'                                                      wrappedLogEntryContent = "";',\r
+'                                                      while ((searchIndex = searchString.indexOf(startToken, startIndex)) > -1) {',\r
+'                                                              var endTokenIndex = searchString.indexOf(endToken, searchIndex);',\r
+'                                                              matchedText = searchString.substring(searchIndex + startToken.length, endTokenIndex);',\r
+'                                                              textBeforeMatch = searchString.substring(startIndex, searchIndex);',\r
+'                                                              logEntryContent += preStartTag + textBeforeMatch + preEndTag;',\r
+'                                                              logEntryContent += searchTermReplacementStartTag + preStartTag + matchedText +',\r
+'                                                                      preEndTag + searchTermReplacementEndTag;',\r
+'                                                              if (isIe) {',\r
+'                                                                      wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +',\r
+'                                                                              matchedText + searchTermReplacementEndTag;',\r
+'                                                              }',\r
+'                                                              startIndex = endTokenIndex + endToken.length;',\r
+'                                                      }',\r
+'                                                      logEntryContent += preStartTag + searchString.substr(startIndex) + preEndTag;',\r
+'                                                      if (isIe) {',\r
+'                                                              wrappedLogEntryContent += searchString.substr(startIndex);',\r
+'                                                      }',\r
+'                                              } else {',\r
+'                                                      logEntryContent = "";',\r
+'                                                      wrappedLogEntryContent = "";',\r
+'                                                      var searchTermReplacementLength = searchTermReplacementStartTag.length +',\r
+'                                                              this.searchTerm.length + searchTermReplacementEndTag.length;',\r
+'                                                      var searchTermLength = this.searchTerm.length;',\r
+'                                                      var searchTermLowerCase = this.searchTerm.toLowerCase();',\r
+'                                                      var logTextLowerCase = logEntry.formattedMessage.toLowerCase();',\r
+'                                                      while ((searchIndex = logTextLowerCase.indexOf(searchTermLowerCase, startIndex)) > -1) {',\r
+'                                                              matchedText = escapeHtml(logEntry.formattedMessage.substr(searchIndex, this.searchTerm.length));',\r
+'                                                              textBeforeMatch = escapeHtml(logEntry.formattedMessage.substring(startIndex, searchIndex));',\r
+'                                                              var searchTermReplacement = searchTermReplacementStartTag +',\r
+'                                                                      preStartTag + matchedText + preEndTag + searchTermReplacementEndTag;',\r
+'                                                              logEntryContent += preStartTag + textBeforeMatch + preEndTag + searchTermReplacement;',\r
+'                                                              if (isIe) {',\r
+'                                                                      wrappedLogEntryContent += textBeforeMatch + searchTermReplacementStartTag +',\r
+'                                                                              matchedText + searchTermReplacementEndTag;',\r
+'                                                              }',\r
+'                                                              startIndex = searchIndex + searchTermLength;',\r
+'                                                      }',\r
+'                                                      var textAfterLastMatch = escapeHtml(logEntry.formattedMessage.substr(startIndex));',\r
+'                                                      logEntryContent += preStartTag + textAfterLastMatch + preEndTag;',\r
+'                                                      if (isIe) {',\r
+'                                                              wrappedLogEntryContent += textAfterLastMatch;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                              logEntry.setContent(logEntryContent, wrappedLogEntryContent);',\r
+'                                              var logEntryMatches = logEntry.getSearchMatches();',\r
+'                                              this.matches = this.matches.concat(logEntryMatches);',\r
+'                                      } else {',\r
+'                                              logEntry.setSearchMatch(false);',\r
+'                                              logEntry.setContent(logEntry.formattedMessage, logEntry.formattedMessage);',\r
+'                                      }',\r
+'                                      return doesMatch;',\r
+'                              },',\r
+'',\r
+'                              removeMatches: function(logEntries) {',\r
+'                                      var matchesToRemoveCount = 0;',\r
+'                                      var currentMatchRemoved = false;',\r
+'                                      var matchesToRemove = [];',\r
+'                                      var i, iLen, j, jLen;',\r
+'',\r
+'                                      // Establish the list of matches to be removed',\r
+'                                      for (i = 0, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                              for (j = 0, jLen = logEntries.length; j < jLen; j++) {',\r
+'                                                      if (this.matches[i].belongsTo(logEntries[j])) {',\r
+'                                                              matchesToRemove.push(this.matches[i]);',\r
+'                                                              if (i === currentMatchIndex) {',\r
+'                                                                      currentMatchRemoved = true;',\r
+'                                                              }',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'',\r
+'                                      // Set the new current match index if the current match has been deleted',\r
+'                                      // This will be the first match that appears after the first log entry being',\r
+'                                      // deleted, if one exists; otherwise, it\'s the first match overall',\r
+'                                      var newMatch = currentMatchRemoved ? null : this.matches[currentMatchIndex];',\r
+'                                      if (currentMatchRemoved) {',\r
+'                                              for (i = currentMatchIndex, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                                      if (this.matches[i].isVisible() && !array_contains(matchesToRemove, this.matches[i])) {',\r
+'                                                              newMatch = this.matches[i];',\r
+'                                                              break;',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      }',\r
+'',\r
+'                                      // Remove the matches',\r
+'                                      for (i = 0, iLen = matchesToRemove.length; i < iLen; i++) {',\r
+'                                              array_remove(this.matches, matchesToRemove[i]);',\r
+'                                              matchesToRemove[i].remove();',\r
+'                                      }',\r
+'',\r
+'                                      // Set the new match, if one exists',\r
+'                                      if (this.hasVisibleMatches()) {',\r
+'                                              if (newMatch === null) {',\r
+'                                                      setCurrentMatchIndex(0);',\r
+'                                              } else {',\r
+'                                                      // Get the index of the new match',\r
+'                                                      var newMatchIndex = 0;',\r
+'                                                      for (i = 0, iLen = this.matches.length; i < iLen; i++) {',\r
+'                                                              if (newMatch === this.matches[i]) {',\r
+'                                                                      newMatchIndex = i;',\r
+'                                                                      break;',\r
+'                                                              }',\r
+'                                                      }',\r
+'                                                      setCurrentMatchIndex(newMatchIndex);',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              currentMatchIndex = null;',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      function getPageOffsetTop(el, container) {',\r
+'                              var currentEl = el;',\r
+'                              var y = 0;',\r
+'                              while (currentEl && currentEl != container) {',\r
+'                                      y += currentEl.offsetTop;',\r
+'                                      currentEl = currentEl.offsetParent;',\r
+'                              }',\r
+'                              return y;',\r
+'                      }',\r
+'',\r
+'                      function scrollIntoView(el) {',\r
+'                              var logContainer = logMainContainer;',\r
+'                              // Check if the whole width of the element is visible and centre if not',\r
+'                              if (!$("wrap").checked) {',\r
+'                                      var logContainerLeft = logContainer.scrollLeft;',\r
+'                                      var logContainerRight = logContainerLeft  + logContainer.offsetWidth;',\r
+'                                      var elLeft = el.offsetLeft;',\r
+'                                      var elRight = elLeft + el.offsetWidth;',\r
+'                                      if (elLeft < logContainerLeft || elRight > logContainerRight) {',\r
+'                                              logContainer.scrollLeft = elLeft - (logContainer.offsetWidth - el.offsetWidth) / 2;',\r
+'                                      }',\r
+'                              }',\r
+'                              // Check if the whole height of the element is visible and centre if not',\r
+'                              var logContainerTop = logContainer.scrollTop;',\r
+'                              var logContainerBottom = logContainerTop  + logContainer.offsetHeight;',\r
+'                              var elTop = getPageOffsetTop(el) - getToolBarsHeight();',\r
+'                              var elBottom = elTop + el.offsetHeight;',\r
+'                              if (elTop < logContainerTop || elBottom > logContainerBottom) {',\r
+'                                      logContainer.scrollTop = elTop - (logContainer.offsetHeight - el.offsetHeight) / 2;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function Match(logEntryLevel, spanInMainDiv, spanInUnwrappedPre, spanInWrappedDiv) {',\r
+'                              this.logEntryLevel = logEntryLevel;',\r
+'                              this.spanInMainDiv = spanInMainDiv;',\r
+'                              if (isIe) {',\r
+'                                      this.spanInUnwrappedPre = spanInUnwrappedPre;',\r
+'                                      this.spanInWrappedDiv = spanInWrappedDiv;',\r
+'                              }',\r
+'                              this.mainSpan = isIe ? spanInUnwrappedPre : spanInMainDiv;',\r
+'                      }',\r
+'',\r
+'                      Match.prototype = {',\r
+'                              equals: function(match) {',\r
+'                                      return this.mainSpan === match.mainSpan;',\r
+'                              },',\r
+'',\r
+'                              setCurrent: function() {',\r
+'                                      if (isIe) {',\r
+'                                              addClass(this.spanInUnwrappedPre, "currentmatch");',\r
+'                                              addClass(this.spanInWrappedDiv, "currentmatch");',\r
+'                                              // Scroll the visible one into view',\r
+'                                              var elementToScroll = $("wrap").checked ? this.spanInWrappedDiv : this.spanInUnwrappedPre;',\r
+'                                              scrollIntoView(elementToScroll);',\r
+'                                      } else {',\r
+'                                              addClass(this.spanInMainDiv, "currentmatch");',\r
+'                                              scrollIntoView(this.spanInMainDiv);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              belongsTo: function(logEntry) {',\r
+'                                      if (isIe) {',\r
+'                                              return isDescendant(this.spanInUnwrappedPre, logEntry.unwrappedPre);',\r
+'                                      } else {',\r
+'                                              return isDescendant(this.spanInMainDiv, logEntry.mainDiv);',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              setNotCurrent: function() {',\r
+'                                      if (isIe) {',\r
+'                                              removeClass(this.spanInUnwrappedPre, "currentmatch");',\r
+'                                              removeClass(this.spanInWrappedDiv, "currentmatch");',\r
+'                                      } else {',\r
+'                                              removeClass(this.spanInMainDiv, "currentmatch");',\r
+'                                      }',\r
+'                              },',\r
+'',\r
+'                              isOrphan: function() {',\r
+'                                      return isOrphan(this.mainSpan);',\r
+'                              },',\r
+'',\r
+'                              isVisible: function() {',\r
+'                                      return getCheckBox(this.logEntryLevel).checked;',\r
+'                              },',\r
+'',\r
+'                              remove: function() {',\r
+'                                      if (isIe) {',\r
+'                                              this.spanInUnwrappedPre = null;',\r
+'                                              this.spanInWrappedDiv = null;',\r
+'                                      } else {',\r
+'                                              this.spanInMainDiv = null;',\r
+'                                      }',\r
+'                              }',\r
+'                      };',\r
+'',\r
+'                      var currentSearch = null;',\r
+'                      var currentMatchIndex = null;',\r
+'',\r
+'                      function doSearch() {',\r
+'                              var searchBox = $("searchBox");',\r
+'                              var searchTerm = searchBox.value;',\r
+'                              var isRegex = $("searchRegex").checked;',\r
+'                              var isCaseSensitive = $("searchCaseSensitive").checked;',\r
+'                              var i;',\r
+'',\r
+'                              if (searchTerm === "") {',\r
+'                                      $("searchReset").disabled = true;',\r
+'                                      $("searchNav").style.display = "none";',\r
+'                                      removeClass(document.body, "searching");',\r
+'                                      removeClass(searchBox, "hasmatches");',\r
+'                                      removeClass(searchBox, "nomatches");',\r
+'                                      for (i = 0; i < logEntries.length; i++) {',\r
+'                                              logEntries[i].clearSearch();',\r
+'                                              logEntries[i].setContent(logEntries[i].formattedMessage, logEntries[i].formattedMessage);',\r
+'                                      }',\r
+'                                      currentSearch = null;',\r
+'                                      setLogContainerHeight();',\r
+'                              } else {',\r
+'                                      $("searchReset").disabled = false;',\r
+'                                      $("searchNav").style.display = "block";',\r
+'                                      var searchRegex;',\r
+'                                      var regexValid;',\r
+'                                      if (isRegex) {',\r
+'                                              try {',\r
+'                                                      searchRegex = isCaseSensitive ? new RegExp(searchTerm, "g") : new RegExp(searchTerm, "gi");',\r
+'                                                      regexValid = true;',\r
+'                                                      replaceClass(searchBox, "validregex", "invalidregex");',\r
+'                                                      searchBox.title = "Valid regex";',\r
+'                                              } catch (ex) {',\r
+'                                                      regexValid = false;',\r
+'                                                      replaceClass(searchBox, "invalidregex", "validregex");',\r
+'                                                      searchBox.title = "Invalid regex: " + (ex.message ? ex.message : (ex.description ? ex.description : "unknown error"));',\r
+'                                                      return;',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              searchBox.title = "";',\r
+'                                              removeClass(searchBox, "validregex");',\r
+'                                              removeClass(searchBox, "invalidregex");',\r
+'                                      }',\r
+'                                      addClass(document.body, "searching");',\r
+'                                      currentSearch = new Search(searchTerm, isRegex, searchRegex, isCaseSensitive);',\r
+'                                      for (i = 0; i < logEntries.length; i++) {',\r
+'                                              currentSearch.applyTo(logEntries[i]);',\r
+'                                      }',\r
+'                                      setLogContainerHeight();',\r
+'',\r
+'                                      // Highlight the first search match',\r
+'                                      if (currentSearch.hasVisibleMatches()) {',\r
+'                                              setCurrentMatchIndex(0);',\r
+'                                              displayMatches();',\r
+'                                      } else {',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function updateSearchFromFilters() {',\r
+'                              if (currentSearch) {',\r
+'                                      if (currentSearch.hasMatches()) {',\r
+'                                              if (currentMatchIndex === null) {',\r
+'                                                      currentMatchIndex = 0;',\r
+'                                              }',\r
+'                                              var currentMatch = currentSearch.matches[currentMatchIndex];',\r
+'                                              if (currentMatch.isVisible()) {',\r
+'                                                      displayMatches();',\r
+'                                                      setCurrentMatchIndex(currentMatchIndex);',\r
+'                                              } else {',\r
+'                                                      currentMatch.setNotCurrent();',\r
+'                                                      // Find the next visible match, if one exists',\r
+'                                                      var nextVisibleMatchIndex = currentSearch.getNextVisibleMatchIndex();',\r
+'                                                      if (nextVisibleMatchIndex > -1) {',\r
+'                                                              setCurrentMatchIndex(nextVisibleMatchIndex);',\r
+'                                                              displayMatches();',\r
+'                                                      } else {',\r
+'                                                              displayNoMatches();',\r
+'                                                      }',\r
+'                                              }',\r
+'                                      } else {',\r
+'                                              displayNoMatches();',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function refreshCurrentMatch() {',\r
+'                              if (currentSearch && currentSearch.hasVisibleMatches()) {',\r
+'                                      setCurrentMatchIndex(currentMatchIndex);',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function displayMatches() {',\r
+'                              replaceClass($("searchBox"), "hasmatches", "nomatches");',\r
+'                              $("searchBox").title = "" + currentSearch.matches.length + " matches found";',\r
+'                              $("searchNav").style.display = "block";',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function displayNoMatches() {',\r
+'                              replaceClass($("searchBox"), "nomatches", "hasmatches");',\r
+'                              $("searchBox").title = "No matches found";',\r
+'                              $("searchNav").style.display = "none";',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchEnabled(enable) {',\r
+'                              enable = (typeof enable == "undefined") ? !$("searchDisable").checked : enable;',\r
+'                              $("searchBox").disabled = !enable;',\r
+'                              $("searchReset").disabled = !enable;',\r
+'                              $("searchRegex").disabled = !enable;',\r
+'                              $("searchNext").disabled = !enable;',\r
+'                              $("searchPrevious").disabled = !enable;',\r
+'                              $("searchCaseSensitive").disabled = !enable;',\r
+'                              $("searchNav").style.display = (enable && ($("searchBox").value !== "") &&',\r
+'                                              currentSearch && currentSearch.hasVisibleMatches()) ?',\r
+'                                      "block" : "none";',\r
+'                              if (enable) {',\r
+'                                      removeClass($("search"), "greyedout");',\r
+'                                      addClass(document.body, "searching");',\r
+'                                      if ($("searchHighlight").checked) {',\r
+'                                              addClass(logMainContainer, "searchhighlight");',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, "searchhighlight");',\r
+'                                      }',\r
+'                                      if ($("searchFilter").checked) {',\r
+'                                              addClass(logMainContainer, "searchfilter");',\r
+'                                      } else {',\r
+'                                              removeClass(logMainContainer, "searchfilter");',\r
+'                                      }',\r
+'                                      $("searchDisable").checked = !enable;',\r
+'                              } else {',\r
+'                                      addClass($("search"), "greyedout");',\r
+'                                      removeClass(document.body, "searching");',\r
+'                                      removeClass(logMainContainer, "searchhighlight");',\r
+'                                      removeClass(logMainContainer, "searchfilter");',\r
+'                              }',\r
+'                              setLogContainerHeight();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchFilter() {',\r
+'                              var enable = $("searchFilter").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "searchfilter");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "searchfilter");',\r
+'                              }',\r
+'                              refreshCurrentMatch();',\r
+'                      }',\r
+'',\r
+'                      function toggleSearchHighlight() {',\r
+'                              var enable = $("searchHighlight").checked;',\r
+'                              if (enable) {',\r
+'                                      addClass(logMainContainer, "searchhighlight");',\r
+'                              } else {',\r
+'                                      removeClass(logMainContainer, "searchhighlight");',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function clearSearch() {',\r
+'                              $("searchBox").value = "";',\r
+'                              doSearch();',\r
+'                      }',\r
+'',\r
+'                      function searchNext() {',\r
+'                              if (currentSearch !== null && currentMatchIndex !== null) {',\r
+'                                      currentSearch.matches[currentMatchIndex].setNotCurrent();',\r
+'                                      var nextMatchIndex = currentSearch.getNextVisibleMatchIndex();',\r
+'                                      if (nextMatchIndex > currentMatchIndex || confirm("Reached the end of the page. Start from the top?")) {',\r
+'                                              setCurrentMatchIndex(nextMatchIndex);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function searchPrevious() {',\r
+'                              if (currentSearch !== null && currentMatchIndex !== null) {',\r
+'                                      currentSearch.matches[currentMatchIndex].setNotCurrent();',\r
+'                                      var previousMatchIndex = currentSearch.getPreviousVisibleMatchIndex();',\r
+'                                      if (previousMatchIndex < currentMatchIndex || confirm("Reached the start of the page. Continue from the bottom?")) {',\r
+'                                              setCurrentMatchIndex(previousMatchIndex);',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function setCurrentMatchIndex(index) {',\r
+'                              currentMatchIndex = index;',\r
+'                              currentSearch.matches[currentMatchIndex].setCurrent();',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------------- */',\r
+'',\r
+'                      // CSS Utilities',\r
+'',\r
+'                      function addClass(el, cssClass) {',\r
+'                              if (!hasClass(el, cssClass)) {',\r
+'                                      if (el.className) {',\r
+'                                              el.className += " " + cssClass;',\r
+'                                      } else {',\r
+'                                              el.className = cssClass;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function hasClass(el, cssClass) {',\r
+'                              if (el.className) {',\r
+'                                      var classNames = el.className.split(" ");',\r
+'                                      return array_contains(classNames, cssClass);',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function removeClass(el, cssClass) {',\r
+'                              if (hasClass(el, cssClass)) {',\r
+'                                      // Rebuild the className property',\r
+'                                      var existingClasses = el.className.split(" ");',\r
+'                                      var newClasses = [];',\r
+'                                      for (var i = 0, len = existingClasses.length; i < len; i++) {',\r
+'                                              if (existingClasses[i] != cssClass) {',\r
+'                                                      newClasses[newClasses.length] = existingClasses[i];',\r
+'                                              }',\r
+'                                      }',\r
+'                                      el.className = newClasses.join(" ");',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function replaceClass(el, newCssClass, oldCssClass) {',\r
+'                              removeClass(el, oldCssClass);',\r
+'                              addClass(el, newCssClass);',\r
+'                      }',\r
+'',\r
+'                      /* ------------------------------------------------------------------------- */',\r
+'',\r
+'                      // Other utility functions',\r
+'',\r
+'                      function getElementsByClass(el, cssClass, tagName) {',\r
+'                              var elements = el.getElementsByTagName(tagName);',\r
+'                              var matches = [];',\r
+'                              for (var i = 0, len = elements.length; i < len; i++) {',\r
+'                                      if (hasClass(elements[i], cssClass)) {',\r
+'                                              matches.push(elements[i]);',\r
+'                                      }',\r
+'                              }',\r
+'                              return matches;',\r
+'                      }',\r
+'',\r
+'                      // Syntax borrowed from Prototype library',\r
+'                      function $(id) {',\r
+'                              return document.getElementById(id);',\r
+'                      }',\r
+'',\r
+'                      function isDescendant(node, ancestorNode) {',\r
+'                              while (node != null) {',\r
+'                                      if (node === ancestorNode) {',\r
+'                                              return true;',\r
+'                                      }',\r
+'                                      node = node.parentNode;',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function isOrphan(node) {',\r
+'                              var currentNode = node;',\r
+'                              while (currentNode) {',\r
+'                                      if (currentNode == document.body) {',\r
+'                                              return false;',\r
+'                                      }',\r
+'                                      currentNode = currentNode.parentNode;',\r
+'                              }',\r
+'                              return true;',\r
+'                      }',\r
+'',\r
+'                      function escapeHtml(str) {',\r
+'                              return str.replace(/&/g, "&amp;").replace(/[<]/g, "&lt;").replace(/>/g, "&gt;");',\r
+'                      }',\r
+'',\r
+'                      function getWindowWidth() {',\r
+'                              if (window.innerWidth) {',\r
+'                                      return window.innerWidth;',\r
+'                              } else if (document.documentElement && document.documentElement.clientWidth) {',\r
+'                                      return document.documentElement.clientWidth;',\r
+'                              } else if (document.body) {',\r
+'                                      return document.body.clientWidth;',\r
+'                              }',\r
+'                              return 0;',\r
+'                      }',\r
+'',\r
+'                      function getWindowHeight() {',\r
+'                              if (window.innerHeight) {',\r
+'                                      return window.innerHeight;',\r
+'                              } else if (document.documentElement && document.documentElement.clientHeight) {',\r
+'                                      return document.documentElement.clientHeight;',\r
+'                              } else if (document.body) {',\r
+'                                      return document.body.clientHeight;',\r
+'                              }',\r
+'                              return 0;',\r
+'                      }',\r
+'',\r
+'                      function getToolBarsHeight() {',\r
+'                              return $("switches").offsetHeight;',\r
+'                      }',\r
+'',\r
+'                      function getChromeHeight() {',\r
+'                              var height = getToolBarsHeight();',\r
+'                              if (showCommandLine) {',\r
+'                                      height += $("commandLine").offsetHeight;',\r
+'                              }',\r
+'                              return height;',\r
+'                      }',\r
+'',\r
+'                      function setLogContainerHeight() {',\r
+'                              if (logMainContainer) {',\r
+'                                      var windowHeight = getWindowHeight();',\r
+'                                      $("body").style.height = getWindowHeight() + "px";',\r
+'                                      logMainContainer.style.height = "" +',\r
+'                                              Math.max(0, windowHeight - getChromeHeight()) + "px";',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function setCommandInputWidth() {',\r
+'                              if (showCommandLine) {',\r
+'                                      $("command").style.width = "" + Math.max(0, $("commandLineContainer").offsetWidth -',\r
+'                                              ($("evaluateButton").offsetWidth + 13)) + "px";',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      window.onresize = function() {',\r
+'                              setCommandInputWidth();',\r
+'                              setLogContainerHeight();',\r
+'                      };',\r
+'',\r
+'                      if (!Array.prototype.push) {',\r
+'                              Array.prototype.push = function() {',\r
+'                              for (var i = 0, len = arguments.length; i < len; i++){',\r
+'                                  this[this.length] = arguments[i];',\r
+'                              }',\r
+'                              return this.length;',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.pop) {',\r
+'                              Array.prototype.pop = function() {',\r
+'                                      if (this.length > 0) {',\r
+'                                              var val = this[this.length - 1];',\r
+'                                              this.length = this.length - 1;',\r
+'                                              return val;',\r
+'                                      }',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.shift) {',\r
+'                              Array.prototype.shift = function() {',\r
+'                                      if (this.length > 0) {',\r
+'                                              var firstItem = this[0];',\r
+'                                              for (var i = 0, len = this.length - 1; i < len; i++) {',\r
+'                                                      this[i] = this[i + 1];',\r
+'                                              }',\r
+'                                              this.length = this.length - 1;',\r
+'                                              return firstItem;',\r
+'                                      }',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      if (!Array.prototype.splice) {',\r
+'                              Array.prototype.splice = function(startIndex, deleteCount) {',\r
+'                                      var itemsAfterDeleted = this.slice(startIndex + deleteCount);',\r
+'                                      var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);',\r
+'                                      this.length = startIndex;',\r
+'                                      // Copy the arguments into a proper Array object',\r
+'                                      var argumentsArray = [];',\r
+'                                      for (var i = 0, len = arguments.length; i < len; i++) {',\r
+'                                              argumentsArray[i] = arguments[i];',\r
+'                                      }',\r
+'                                      var itemsToAppend = (argumentsArray.length > 2) ?',\r
+'                                              itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;',\r
+'                                      for (i = 0, len = itemsToAppend.length; i < len; i++) {',\r
+'                                              this.push(itemsToAppend[i]);',\r
+'                                      }',\r
+'                                      return itemsDeleted;',\r
+'                              };',\r
+'                      }',\r
+'',\r
+'                      function array_remove(arr, val) {',\r
+'                              var index = -1;',\r
+'                              for (var i = 0, len = arr.length; i < len; i++) {',\r
+'                                      if (arr[i] === val) {',\r
+'                                              index = i;',\r
+'                                              break;',\r
+'                                      }',\r
+'                              }',\r
+'                              if (index >= 0) {',\r
+'                                      arr.splice(index, 1);',\r
+'                                      return index;',\r
+'                              } else {',\r
+'                                      return false;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function array_removeFromStart(array, numberToRemove) {',\r
+'                              if (Array.prototype.splice) {',\r
+'                                      array.splice(0, numberToRemove);',\r
+'                              } else {',\r
+'                                      for (var i = numberToRemove, len = array.length; i < len; i++) {',\r
+'                                              array[i - numberToRemove] = array[i];',\r
+'                                      }',\r
+'                                      array.length = array.length - numberToRemove;',\r
+'                              }',\r
+'                              return array;',\r
+'                      }',\r
+'',\r
+'                      function array_contains(arr, val) {',\r
+'                              for (var i = 0, len = arr.length; i < len; i++) {',\r
+'                                      if (arr[i] == val) {',\r
+'                                              return true;',\r
+'                                      }',\r
+'                              }',\r
+'                              return false;',\r
+'                      }',\r
+'',\r
+'                      function getErrorMessage(ex) {',\r
+'                              if (ex.message) {',\r
+'                                      return ex.message;',\r
+'                              } else if (ex.description) {',\r
+'                                      return ex.description;',\r
+'                              }',\r
+'                              return "" + ex;',\r
+'                      }',\r
+'',\r
+'                      function moveCaretToEnd(input) {',\r
+'                              if (input.setSelectionRange) {',\r
+'                                      input.focus();',\r
+'                                      var length = input.value.length;',\r
+'                                      input.setSelectionRange(length, length);',\r
+'                              } else if (input.createTextRange) {',\r
+'                                      var range = input.createTextRange();',\r
+'                                      range.collapse(false);',\r
+'                                      range.select();',\r
+'                              }',\r
+'                              input.focus();',\r
+'                      }',\r
+'',\r
+'                      function stopPropagation(evt) {',\r
+'                              if (evt.stopPropagation) {',\r
+'                                      evt.stopPropagation();',\r
+'                              } else if (typeof evt.cancelBubble != "undefined") {',\r
+'                                      evt.cancelBubble = true;',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function getEvent(evt) {',\r
+'                              return evt ? evt : event;',\r
+'                      }',\r
+'',\r
+'                      function getTarget(evt) {',\r
+'                              return evt.target ? evt.target : evt.srcElement;',\r
+'                      }',\r
+'',\r
+'                      function getRelatedTarget(evt) {',\r
+'                              if (evt.relatedTarget) {',\r
+'                                      return evt.relatedTarget;',\r
+'                              } else if (evt.srcElement) {',\r
+'                                      switch(evt.type) {',\r
+'                                              case "mouseover":',\r
+'                                                      return evt.fromElement;',\r
+'                                              case "mouseout":',\r
+'                                                      return evt.toElement;',\r
+'                                              default:',\r
+'                                                      return evt.srcElement;',\r
+'                                      }',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      function cancelKeyEvent(evt) {',\r
+'                              evt.returnValue = false;',\r
+'                              stopPropagation(evt);',\r
+'                      }',\r
+'',\r
+'                      function evalCommandLine() {',\r
+'                              var expr = $("command").value;',\r
+'                              evalCommand(expr);',\r
+'                              $("command").value = "";',\r
+'                      }',\r
+'',\r
+'                      function evalLastCommand() {',\r
+'                              if (lastCommand != null) {',\r
+'                                      evalCommand(lastCommand);',\r
+'                              }',\r
+'                      }',\r
+'',\r
+'                      var lastCommand = null;',\r
+'                      var commandHistory = [];',\r
+'                      var currentCommandIndex = 0;',\r
+'',\r
+'                      function evalCommand(expr) {',\r
+'                              if (appender) {',\r
+'                                      appender.evalCommandAndAppend(expr);',\r
+'                              } else {',\r
+'                                      var prefix = ">>> " + expr + "\\r\\n";',\r
+'                                      try {',\r
+'                                              log("INFO", prefix + eval(expr));',\r
+'                                      } catch (ex) {',\r
+'                                              log("ERROR", prefix + "Error: " + getErrorMessage(ex));',\r
+'                                      }',\r
+'                              }',\r
+'                              // Update command history',\r
+'                              if (expr != commandHistory[commandHistory.length - 1]) {',\r
+'                                      commandHistory.push(expr);',\r
+'                                      // Update the appender',\r
+'                                      if (appender) {',\r
+'                                              appender.storeCommandHistory(commandHistory);',\r
+'                                      }',\r
+'                              }',\r
+'                              currentCommandIndex = (expr == commandHistory[currentCommandIndex]) ? currentCommandIndex + 1 : commandHistory.length;',\r
+'                              lastCommand = expr;',\r
+'                      }',\r
+'                      //]]>',\r
+'              </script>',\r
+'              <style type="text/css">',\r
+'                      body {',\r
+'                              background-color: white;',\r
+'                              color: black;',\r
+'                              padding: 0;',\r
+'                              margin: 0;',\r
+'                              font-family: tahoma, verdana, arial, helvetica, sans-serif;',\r
+'                              overflow: hidden;',\r
+'                      }',\r
+'',\r
+'                      div#switchesContainer input {',\r
+'                              margin-bottom: 0;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar {',\r
+'                              border-top: solid #ffffff 1px;',\r
+'                              border-bottom: solid #aca899 1px;',\r
+'                              background-color: #f1efe7;',\r
+'                              padding: 3px 5px;',\r
+'                              font-size: 68.75%;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar, div#search input {',\r
+'                              font-family: tahoma, verdana, arial, helvetica, sans-serif;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar input.button {',\r
+'                              padding: 0 5px;',\r
+'                              font-size: 100%;',\r
+'                      }',\r
+'',\r
+'                      div.toolbar input.hidden {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#switches input#clearButton {',\r
+'                              margin-left: 20px;',\r
+'                      }',\r
+'',\r
+'                      div#levels label {',\r
+'                              font-weight: bold;',\r
+'                      }',\r
+'',\r
+'                      div#levels label, div#options label {',\r
+'                              margin-right: 5px;',\r
+'                      }',\r
+'',\r
+'                      div#levels label#wrapLabel {',\r
+'                              font-weight: normal;',\r
+'                      }',\r
+'',\r
+'                      div#search label {',\r
+'                              margin-right: 10px;',\r
+'                      }',\r
+'',\r
+'                      div#search label.searchboxlabel {',\r
+'                              margin-right: 0;',\r
+'                      }',\r
+'',\r
+'                      div#search input {',\r
+'                              font-size: 100%;',\r
+'                      }',\r
+'',\r
+'                      div#search input.validregex {',\r
+'                              color: green;',\r
+'                      }',\r
+'',\r
+'                      div#search input.invalidregex {',\r
+'                              color: red;',\r
+'                      }',\r
+'',\r
+'                      div#search input.nomatches {',\r
+'                              color: white;',\r
+'                              background-color: #ff6666;',\r
+'                      }',\r
+'',\r
+'                      div#search input.nomatches {',\r
+'                              color: white;',\r
+'                              background-color: #ff6666;',\r
+'                      }',\r
+'',\r
+'                      div#searchNav {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine input#command {',\r
+'                              font-size: 100%;',\r
+'                              font-family: Courier New, Courier;',\r
+'                      }',\r
+'',\r
+'                      div#commandLine input#evaluateButton {',\r
+'                      }',\r
+'',\r
+'                      *.greyedout {',\r
+'                              color: gray !important;',\r
+'                              border-color: gray !important;',\r
+'                      }',\r
+'',\r
+'                      *.greyedout *.alwaysenabled { color: black; }',\r
+'',\r
+'                      *.unselectable {',\r
+'                              -khtml-user-select: none;',\r
+'                              -moz-user-select: none;',\r
+'                              user-select: none;',\r
+'                      }',\r
+'',\r
+'                      div#log {',\r
+'                              font-family: Courier New, Courier;',\r
+'                              font-size: 75%;',\r
+'                              width: 100%;',\r
+'                              overflow: auto;',\r
+'                              clear: both;',\r
+'                              position: relative;',\r
+'                      }',\r
+'',\r
+'                      div.group {',\r
+'                              border-color: #cccccc;',\r
+'                              border-style: solid;',\r
+'                              border-width: 1px 0 1px 1px;',\r
+'                              overflow: visible;',\r
+'                      }',\r
+'',\r
+'                      div.oldIe div.group, div.oldIe div.group *, div.oldIe *.logentry {',\r
+'                              height: 1%;',\r
+'                      }',\r
+'',\r
+'                      div.group div.groupheading span.expander {',\r
+'                              border: solid black 1px;',\r
+'                              font-family: Courier New, Courier;',\r
+'                              font-size: 0.833em;',\r
+'                              background-color: #eeeeee;',\r
+'                              position: relative;',\r
+'                              top: -1px;',\r
+'                              color: black;',\r
+'                              padding: 0 2px;',\r
+'                              cursor: pointer;',\r
+'                              cursor: hand;',\r
+'                              height: 1%;',\r
+'                      }',\r
+'',\r
+'                      div.group div.groupcontent {',\r
+'                              margin-left: 10px;',\r
+'                              padding-bottom: 2px;',\r
+'                              overflow: visible;',\r
+'                      }',\r
+'',\r
+'                      div.group div.expanded {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div.group div.collapsed {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      *.logentry {',\r
+'                              overflow: visible;',\r
+'                              display: none;',\r
+'                              white-space: pre;',\r
+'                      }',\r
+'',\r
+'                      span.pre {',\r
+'                              white-space: pre;',\r
+'                      }',\r
+'                      ',\r
+'                      pre.unwrapped {',\r
+'                              display: inline !important;',\r
+'                      }',\r
+'',\r
+'                      pre.unwrapped pre.pre, div.wrapped pre.pre {',\r
+'                              display: inline;',\r
+'                      }',\r
+'',\r
+'                      div.wrapped pre.pre {',\r
+'                              white-space: normal;',\r
+'                      }',\r
+'',\r
+'                      div.wrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      body.searching *.logentry span.currentmatch {',\r
+'                              color: white !important;',\r
+'                              background-color: green !important;',\r
+'                      }',\r
+'',\r
+'                      body.searching div.searchhighlight *.logentry span.searchterm {',\r
+'                              color: black;',\r
+'                              background-color: yellow;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry {',\r
+'                              white-space: normal !important;',\r
+'                              border-width: 0 0 1px 0;',\r
+'                              border-color: #dddddd;',\r
+'                              border-style: dotted;',\r
+'                      }',\r
+'',\r
+'                      div.wrap #log_wrapped, #log_unwrapped {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div.wrap #log_unwrapped, #log_wrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry span.pre {',\r
+'                              overflow: visible;',\r
+'                              white-space: normal;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry pre.unwrapped {',\r
+'                              display: none;',\r
+'                      }',\r
+'',\r
+'                      div.wrap *.logentry span.wrapped {',\r
+'                              display: inline;',\r
+'                      }',\r
+'',\r
+'                      div.searchfilter *.searchnonmatch {',\r
+'                              display: none !important;',\r
+'                      }',\r
+'',\r
+'                      div#log *.TRACE, label#label_TRACE {',\r
+'                              color: #666666;',\r
+'                      }',\r
+'',\r
+'                      div#log *.DEBUG, label#label_DEBUG {',\r
+'                              color: green;',\r
+'                      }',\r
+'',\r
+'                      div#log *.INFO, label#label_INFO {',\r
+'                              color: #000099;',\r
+'                      }',\r
+'',\r
+'                      div#log *.WARN, label#label_WARN {',\r
+'                              color: #999900;',\r
+'                      }',\r
+'',\r
+'                      div#log *.ERROR, label#label_ERROR {',\r
+'                              color: red;',\r
+'                      }',\r
+'',\r
+'                      div#log *.FATAL, label#label_FATAL {',\r
+'                              color: #660066;',\r
+'                      }',\r
+'',\r
+'                      div.TRACE#log *.TRACE,',\r
+'                      div.DEBUG#log *.DEBUG,',\r
+'                      div.INFO#log *.INFO,',\r
+'                      div.WARN#log *.WARN,',\r
+'                      div.ERROR#log *.ERROR,',\r
+'                      div.FATAL#log *.FATAL {',\r
+'                              display: block;',\r
+'                      }',\r
+'',\r
+'                      div#log div.separator {',\r
+'                              background-color: #cccccc;',\r
+'                              margin: 5px 0;',\r
+'                              line-height: 1px;',\r
+'                      }',\r
+'              </style>',\r
+'      </head>',\r
+'',\r
+'      <body id="body">',\r
+'              <div id="switchesContainer">',\r
+'                      <div id="switches">',\r
+'                              <div id="levels" class="toolbar">',\r
+'                                      Filters:',\r
+'                                      <input type="checkbox" id="switch_TRACE" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide trace messages" /><label for="switch_TRACE" id="label_TRACE">trace</label>',\r
+'                                      <input type="checkbox" id="switch_DEBUG" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide debug messages" /><label for="switch_DEBUG" id="label_DEBUG">debug</label>',\r
+'                                      <input type="checkbox" id="switch_INFO" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide info messages" /><label for="switch_INFO" id="label_INFO">info</label>',\r
+'                                      <input type="checkbox" id="switch_WARN" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide warn messages" /><label for="switch_WARN" id="label_WARN">warn</label>',\r
+'                                      <input type="checkbox" id="switch_ERROR" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide error messages" /><label for="switch_ERROR" id="label_ERROR">error</label>',\r
+'                                      <input type="checkbox" id="switch_FATAL" onclick="applyFilters(); checkAllLevels()" checked="checked" title="Show/hide fatal messages" /><label for="switch_FATAL" id="label_FATAL">fatal</label>',\r
+'                                      <input type="checkbox" id="switch_ALL" onclick="toggleAllLevels(); applyFilters()" checked="checked" title="Show/hide all messages" /><label for="switch_ALL" id="label_ALL">all</label>',\r
+'                              </div>',\r
+'                              <div id="search" class="toolbar">',\r
+'                                      <label for="searchBox" class="searchboxlabel">Search:</label> <input type="text" id="searchBox" onclick="toggleSearchEnabled(true)" onkeyup="scheduleSearch()" size="20" />',\r
+'                                      <input type="button" id="searchReset" disabled="disabled" value="Reset" onclick="clearSearch()" class="button" title="Reset the search" />',\r
+'                                      <input type="checkbox" id="searchRegex" onclick="doSearch()" title="If checked, search is treated as a regular expression" /><label for="searchRegex">Regex</label>',\r
+'                                      <input type="checkbox" id="searchCaseSensitive" onclick="doSearch()" title="If checked, search is case sensitive" /><label for="searchCaseSensitive">Match case</label>',\r
+'                                      <input type="checkbox" id="searchDisable" onclick="toggleSearchEnabled()" title="Enable/disable search" /><label for="searchDisable" class="alwaysenabled">Disable</label>',\r
+'                                      <div id="searchNav">',\r
+'                                              <input type="button" id="searchNext" disabled="disabled" value="Next" onclick="searchNext()" class="button" title="Go to the next matching log entry" />',\r
+'                                              <input type="button" id="searchPrevious" disabled="disabled" value="Previous" onclick="searchPrevious()" class="button" title="Go to the previous matching log entry" />',\r
+'                                              <input type="checkbox" id="searchFilter" onclick="toggleSearchFilter()" title="If checked, non-matching log entries are filtered out" /><label for="searchFilter">Filter</label>',\r
+'                                              <input type="checkbox" id="searchHighlight" onclick="toggleSearchHighlight()" title="Highlight matched search terms" /><label for="searchHighlight" class="alwaysenabled">Highlight all</label>',\r
+'                                      </div>',\r
+'                              </div>',\r
+'                              <div id="options" class="toolbar">',\r
+'                                      Options:',\r
+'                                      <input type="checkbox" id="enableLogging" onclick="toggleLoggingEnabled()" checked="checked" title="Enable/disable logging" /><label for="enableLogging" id="enableLoggingLabel">Log</label>',\r
+'                                      <input type="checkbox" id="wrap" onclick="toggleWrap()" title="Enable / disable word wrap" /><label for="wrap" id="wrapLabel">Wrap</label>',\r
+'                                      <input type="checkbox" id="newestAtTop" onclick="toggleNewestAtTop()" title="If checked, causes newest messages to appear at the top" /><label for="newestAtTop" id="newestAtTopLabel">Newest at the top</label>',\r
+'                                      <input type="checkbox" id="scrollToLatest" onclick="toggleScrollToLatest()" checked="checked" title="If checked, window automatically scrolls to a new message when it is added" /><label for="scrollToLatest" id="scrollToLatestLabel">Scroll to latest</label>',\r
+'                                      <input type="button" id="clearButton" value="Clear" onclick="clearLog()" class="button" title="Clear all log messages"  />',\r
+'                                      <input type="button" id="hideButton" value="Hide" onclick="hide()" class="hidden button" title="Hide the console" />',\r
+'                                      <input type="button" id="closeButton" value="Close" onclick="closeWindow()" class="hidden button" title="Close the window" />',\r
+'                              </div>',\r
+'                      </div>',\r
+'              </div>',\r
+'              <div id="log" class="TRACE DEBUG INFO WARN ERROR FATAL"></div>',\r
+'              <div id="commandLine" class="toolbar">',\r
+'                      <div id="commandLineContainer">',\r
+'                              <input type="text" id="command" title="Enter a JavaScript command here and hit return or press \'Evaluate\'" />',\r
+'                              <input type="button" id="evaluateButton" value="Evaluate" class="button" title="Evaluate the command" onclick="evalCommandLine()" />',\r
+'                      </div>',\r
+'              </div>',\r
+'      </body>',\r
+'</html>',\r
+''\r
+];\r
+               };\r
+\r
+               var defaultCommandLineFunctions = [];\r
+\r
+               ConsoleAppender = function() {};\r
+\r
+               var consoleAppenderIdCounter = 1;\r
+               ConsoleAppender.prototype = new Appender();\r
+\r
+               ConsoleAppender.prototype.create = function(inPage, container,\r
+                               lazyInit, initiallyMinimized, useDocumentWrite, width, height, focusConsoleWindow) {\r
+                       var appender = this;\r
+\r
+                       // Common properties\r
+                       var initialized = false;\r
+                       var consoleWindowCreated = false;\r
+                       var consoleWindowLoaded = false;\r
+                       var consoleClosed = false;\r
+\r
+                       var queuedLoggingEvents = [];\r
+                       var isSupported = true;\r
+                       var consoleAppenderId = consoleAppenderIdCounter++;\r
+\r
+                       // Local variables\r
+                       initiallyMinimized = extractBooleanFromParam(initiallyMinimized, this.defaults.initiallyMinimized);\r
+                       lazyInit = extractBooleanFromParam(lazyInit, this.defaults.lazyInit);\r
+                       useDocumentWrite = extractBooleanFromParam(useDocumentWrite, this.defaults.useDocumentWrite);\r
+                       var newestMessageAtTop = this.defaults.newestMessageAtTop;\r
+                       var scrollToLatestMessage = this.defaults.scrollToLatestMessage;\r
+                       width = width ? width : this.defaults.width;\r
+                       height = height ? height : this.defaults.height;\r
+                       var maxMessages = this.defaults.maxMessages;\r
+                       var showCommandLine = this.defaults.showCommandLine;\r
+                       var commandLineObjectExpansionDepth = this.defaults.commandLineObjectExpansionDepth;\r
+                       var showHideButton = this.defaults.showHideButton;\r
+            var showCloseButton = this.defaults.showCloseButton;\r
+            var showLogEntryDeleteButtons = this.defaults.showLogEntryDeleteButtons;\r
+\r
+                       this.setLayout(this.defaults.layout);\r
+\r
+                       // Functions whose implementations vary between subclasses\r
+                       var init, createWindow, safeToAppend, getConsoleWindow, open;\r
+\r
+                       // Configuration methods. The function scope is used to prevent\r
+                       // direct alteration to the appender configuration properties.\r
+                       var appenderName = inPage ? "InPageAppender" : "PopUpAppender";\r
+                       var checkCanConfigure = function(configOptionName) {\r
+                               if (consoleWindowCreated) {\r
+                                       handleError(appenderName + ": configuration option '" + configOptionName + "' may not be set after the appender has been initialized");\r
+                                       return false;\r
+                               }\r
+                               return true;\r
+                       };\r
+\r
+                       var consoleWindowExists = function() {\r
+                               return (consoleWindowLoaded && isSupported && !consoleClosed);\r
+                       };\r
+\r
+                       this.isNewestMessageAtTop = function() { return newestMessageAtTop; };\r
+                       this.setNewestMessageAtTop = function(newestMessageAtTopParam) {\r
+                               newestMessageAtTop = bool(newestMessageAtTopParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setNewestAtTop(newestMessageAtTop);\r
+                               }\r
+                       };\r
+\r
+                       this.isScrollToLatestMessage = function() { return scrollToLatestMessage; };\r
+                       this.setScrollToLatestMessage = function(scrollToLatestMessageParam) {\r
+                               scrollToLatestMessage = bool(scrollToLatestMessageParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setScrollToLatest(scrollToLatestMessage);\r
+                               }\r
+                       };\r
+\r
+                       this.getWidth = function() { return width; };\r
+                       this.setWidth = function(widthParam) {\r
+                               if (checkCanConfigure("width")) {\r
+                                       width = extractStringFromParam(widthParam, width);\r
+                               }\r
+                       };\r
+\r
+                       this.getHeight = function() { return height; };\r
+                       this.setHeight = function(heightParam) {\r
+                               if (checkCanConfigure("height")) {\r
+                                       height = extractStringFromParam(heightParam, height);\r
+                               }\r
+                       };\r
+\r
+                       this.getMaxMessages = function() { return maxMessages; };\r
+                       this.setMaxMessages = function(maxMessagesParam) {\r
+                               maxMessages = extractIntFromParam(maxMessagesParam, maxMessages);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setMaxMessages(maxMessages);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowCommandLine = function() { return showCommandLine; };\r
+                       this.setShowCommandLine = function(showCommandLineParam) {\r
+                               showCommandLine = bool(showCommandLineParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowCommandLine(showCommandLine);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowHideButton = function() { return showHideButton; };\r
+                       this.setShowHideButton = function(showHideButtonParam) {\r
+                               showHideButton = bool(showHideButtonParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowHideButton(showHideButton);\r
+                               }\r
+                       };\r
+\r
+                       this.isShowCloseButton = function() { return showCloseButton; };\r
+                       this.setShowCloseButton = function(showCloseButtonParam) {\r
+                               showCloseButton = bool(showCloseButtonParam);\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().setShowCloseButton(showCloseButton);\r
+                               }\r
+                       };\r
+\r
+                       this.getCommandLineObjectExpansionDepth = function() { return commandLineObjectExpansionDepth; };\r
+                       this.setCommandLineObjectExpansionDepth = function(commandLineObjectExpansionDepthParam) {\r
+                               commandLineObjectExpansionDepth = extractIntFromParam(commandLineObjectExpansionDepthParam, commandLineObjectExpansionDepth);\r
+                       };\r
+\r
+                       var minimized = initiallyMinimized;\r
+                       this.isInitiallyMinimized = function() { return initiallyMinimized; };\r
+                       this.setInitiallyMinimized = function(initiallyMinimizedParam) {\r
+                               if (checkCanConfigure("initiallyMinimized")) {\r
+                                       initiallyMinimized = bool(initiallyMinimizedParam);\r
+                                       minimized = initiallyMinimized;\r
+                               }\r
+                       };\r
+\r
+                       this.isUseDocumentWrite = function() { return useDocumentWrite; };\r
+                       this.setUseDocumentWrite = function(useDocumentWriteParam) {\r
+                               if (checkCanConfigure("useDocumentWrite")) {\r
+                                       useDocumentWrite = bool(useDocumentWriteParam);\r
+                               }\r
+                       };\r
+\r
+                       // Common methods\r
+                       function QueuedLoggingEvent(loggingEvent, formattedMessage) {\r
+                               this.loggingEvent = loggingEvent;\r
+                               this.levelName = loggingEvent.level.name;\r
+                               this.formattedMessage = formattedMessage;\r
+                       }\r
+\r
+                       QueuedLoggingEvent.prototype.append = function() {\r
+                               getConsoleWindow().log(this.levelName, this.formattedMessage);\r
+                       };\r
+\r
+                       function QueuedGroup(name, initiallyExpanded) {\r
+                               this.name = name;\r
+                               this.initiallyExpanded = initiallyExpanded;\r
+                       }\r
+\r
+                       QueuedGroup.prototype.append = function() {\r
+                               getConsoleWindow().group(this.name, this.initiallyExpanded);\r
+                       };\r
+\r
+                       function QueuedGroupEnd() {}\r
+\r
+                       QueuedGroupEnd.prototype.append = function() {\r
+                               getConsoleWindow().groupEnd();\r
+                       };\r
+\r
+                       var checkAndAppend = function() {\r
+                               // Next line forces a check of whether the window has been closed\r
+                               safeToAppend();\r
+                               if (!initialized) {\r
+                                       init();\r
+                               } else if (consoleClosed && reopenWhenClosed) {\r
+                                       createWindow();\r
+                               }\r
+                               if (safeToAppend()) {\r
+                                       appendQueuedLoggingEvents();\r
+                               }\r
+                       };\r
+\r
+                       this.append = function(loggingEvent) {\r
+                               if (isSupported) {\r
+                                       // Format the message\r
+                                       var formattedMessage = appender.getLayout().format(loggingEvent);\r
+                                       if (this.getLayout().ignoresThrowable()) {\r
+                                               formattedMessage += loggingEvent.getThrowableStrRep();\r
+                                       }\r
+                                       queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent, formattedMessage));\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+            this.group = function(name, initiallyExpanded) {\r
+                               if (isSupported) {\r
+                                       queuedLoggingEvents.push(new QueuedGroup(name, initiallyExpanded));\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+            this.groupEnd = function() {\r
+                               if (isSupported) {\r
+                                       queuedLoggingEvents.push(new QueuedGroupEnd());\r
+                                       checkAndAppend();\r
+                               }\r
+                       };\r
+\r
+                       var appendQueuedLoggingEvents = function() {\r
+                               var currentLoggingEvent;\r
+                               while (queuedLoggingEvents.length > 0) {\r
+                                       queuedLoggingEvents.shift().append();\r
+                               }\r
+                               if (focusConsoleWindow) {\r
+                                       getConsoleWindow().focus();\r
+                               }\r
+                       };\r
+\r
+                       this.setAddedToLogger = function(logger) {\r
+                               this.loggers.push(logger);\r
+                               if (enabled && !lazyInit) {\r
+                                       init();\r
+                               }\r
+                       };\r
+\r
+                       this.clear = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().clearLog();\r
+                               }\r
+                               queuedLoggingEvents.length = 0;\r
+                       };\r
+\r
+                       this.focus = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focus();\r
+                               }\r
+                       };\r
+\r
+                       this.focusCommandLine = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focusCommandLine();\r
+                               }\r
+                       };\r
+\r
+                       this.focusSearch = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().focusSearch();\r
+                               }\r
+                       };\r
+\r
+                       var commandWindow = window;\r
+\r
+                       this.getCommandWindow = function() { return commandWindow; };\r
+                       this.setCommandWindow = function(commandWindowParam) {\r
+                               commandWindow = commandWindowParam;\r
+                       };\r
+\r
+                       this.executeLastCommand = function() {\r
+                               if (consoleWindowExists()) {\r
+                                       getConsoleWindow().evalLastCommand();\r
+                               }\r
+                       };\r
+\r
+                       var commandLayout = new PatternLayout("%m");\r
+                       this.getCommandLayout = function() { return commandLayout; };\r
+                       this.setCommandLayout = function(commandLayoutParam) {\r
+                               commandLayout = commandLayoutParam;\r
+                       };\r
+\r
+                       this.evalCommandAndAppend = function(expr) {\r
+                               var commandReturnValue = { appendResult: true, isError: false };\r
+                               var commandOutput = "";\r
+                               // Evaluate the command\r
+                               try {\r
+                                       var result, i;\r
+                                       // The next three lines constitute a workaround for IE. Bizarrely, iframes seem to have no\r
+                                       // eval method on the window object initially, but once execScript has been called on\r
+                                       // it once then the eval method magically appears. See http://www.thismuchiknow.co.uk/?p=25\r
+                                       if (!commandWindow.eval && commandWindow.execScript) {\r
+                                               commandWindow.execScript("null");\r
+                                       }\r
+\r
+                                       var commandLineFunctionsHash = {};\r
+                                       for (i = 0, len = commandLineFunctions.length; i < len; i++) {\r
+                                               commandLineFunctionsHash[commandLineFunctions[i][0]] = commandLineFunctions[i][1];\r
+                                       }\r
+\r
+                                       // Keep an array of variables that are being changed in the command window so that they\r
+                                       // can be restored to their original values afterwards\r
+                                       var objectsToRestore = [];\r
+                                       var addObjectToRestore = function(name) {\r
+                                               objectsToRestore.push([name, commandWindow[name]]);\r
+                                       };\r
+\r
+                                       addObjectToRestore("appender");\r
+                                       commandWindow.appender = appender;\r
+\r
+                                       addObjectToRestore("commandReturnValue");\r
+                                       commandWindow.commandReturnValue = commandReturnValue;\r
+\r
+                                       addObjectToRestore("commandLineFunctionsHash");\r
+                                       commandWindow.commandLineFunctionsHash = commandLineFunctionsHash;\r
+\r
+                                       var addFunctionToWindow = function(name) {\r
+                                               addObjectToRestore(name);\r
+                                               commandWindow[name] = function() {\r
+                                                       return this.commandLineFunctionsHash[name](appender, arguments, commandReturnValue);\r
+                                               };\r
+                                       };\r
+\r
+                                       for (i = 0, len = commandLineFunctions.length; i < len; i++) {\r
+                                               addFunctionToWindow(commandLineFunctions[i][0]);\r
+                                       }\r
+\r
+                                       // Another bizarre workaround to get IE to eval in the global scope\r
+                                       if (commandWindow === window && commandWindow.execScript) {\r
+                                               addObjectToRestore("evalExpr");\r
+                                               addObjectToRestore("result");\r
+                                               window.evalExpr = expr;\r
+                                               commandWindow.execScript("window.result=eval(window.evalExpr);");\r
+                                               result = window.result;\r
+                                       } else {\r
+                                               result = commandWindow.eval(expr);\r
+                                       }\r
+                                       commandOutput = isUndefined(result) ? result : formatObjectExpansion(result, commandLineObjectExpansionDepth);\r
+\r
+                                       // Restore variables in the command window to their original state\r
+                                       for (i = 0, len = objectsToRestore.length; i < len; i++) {\r
+                                               commandWindow[objectsToRestore[i][0]] = objectsToRestore[i][1];\r
+                                       }\r
+                               } catch (ex) {\r
+                                       commandOutput = "Error evaluating command: " + getExceptionStringRep(ex);\r
+                                       commandReturnValue.isError = true;\r
+                               }\r
+                               // Append command output\r
+                               if (commandReturnValue.appendResult) {\r
+                                       var message = ">>> " + expr;\r
+                                       if (!isUndefined(commandOutput)) {\r
+                                               message += newLine + commandOutput;\r
+                                       }\r
+                                       var level = commandReturnValue.isError ? Level.ERROR : Level.INFO;\r
+                                       var loggingEvent = new LoggingEvent(null, new Date(), level, [message], null);\r
+                                       var mainLayout = this.getLayout();\r
+                                       this.setLayout(commandLayout);\r
+                                       this.append(loggingEvent);\r
+                                       this.setLayout(mainLayout);\r
+                               }\r
+                       };\r
+\r
+                       var commandLineFunctions = defaultCommandLineFunctions.concat([]);\r
+\r
+                       this.addCommandLineFunction = function(functionName, commandLineFunction) {\r
+                               commandLineFunctions.push([functionName, commandLineFunction]);\r
+                       };\r
+\r
+                       var commandHistoryCookieName = "log4javascriptCommandHistory";\r
+                       this.storeCommandHistory = function(commandHistory) {\r
+                               setCookie(commandHistoryCookieName, commandHistory.join(","));\r
+                       };\r
+\r
+                       var writeHtml = function(doc) {\r
+                               var lines = getConsoleHtmlLines();\r
+                               doc.open();\r
+                               for (var i = 0, len = lines.length; i < len; i++) {\r
+                                       doc.writeln(lines[i]);\r
+                               }\r
+                               doc.close();\r
+                       };\r
+\r
+                       // Set up event listeners\r
+                       this.setEventTypes(["load", "unload"]);\r
+\r
+                       var consoleWindowLoadHandler = function() {\r
+                               var win = getConsoleWindow();\r
+                               win.setAppender(appender);\r
+                               win.setNewestAtTop(newestMessageAtTop);\r
+                               win.setScrollToLatest(scrollToLatestMessage);\r
+                               win.setMaxMessages(maxMessages);\r
+                               win.setShowCommandLine(showCommandLine);\r
+                               win.setShowHideButton(showHideButton);\r
+                               win.setShowCloseButton(showCloseButton);\r
+                               win.setMainWindow(window);\r
+\r
+                               // Restore command history stored in cookie\r
+                               var storedValue = getCookie(commandHistoryCookieName);\r
+                               if (storedValue) {\r
+                                       win.commandHistory = storedValue.split(",");\r
+                                       win.currentCommandIndex = win.commandHistory.length;\r
+                               }\r
+\r
+                               appender.dispatchEvent("load", { "win" : win });\r
+                       };\r
+\r
+                       this.unload = function() {\r
+                               logLog.debug("unload " + this + ", caller: " + this.unload.caller);\r
+                               if (!consoleClosed) {\r
+                                       logLog.debug("really doing unload " + this);\r
+                                       consoleClosed = true;\r
+                                       consoleWindowLoaded = false;\r
+                                       consoleWindowCreated = false;\r
+                                       appender.dispatchEvent("unload", {});\r
+                               }\r
+                       };\r
+\r
+                       var pollConsoleWindow = function(windowTest, interval, successCallback, errorMessage) {\r
+                               function doPoll() {\r
+                                       try {\r
+                                               // Test if the console has been closed while polling\r
+                                               if (consoleClosed) {\r
+                                                       clearInterval(poll);\r
+                                               }\r
+                                               if (windowTest(getConsoleWindow())) {\r
+                                                       clearInterval(poll);\r
+                                                       successCallback();\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               clearInterval(poll);\r
+                                               isSupported = false;\r
+                                               handleError(errorMessage, ex);\r
+                                       }\r
+                               }\r
+\r
+                               // Poll the pop-up since the onload event is not reliable\r
+                               var poll = setInterval(doPoll, interval);\r
+                       };\r
+\r
+                       var getConsoleUrl = function() {\r
+                               var documentDomainSet = (document.domain != location.hostname);\r
+                               return useDocumentWrite ? "" : getBaseUrl() + "console_uncompressed.html" +\r
+                                                                                          (documentDomainSet ? "?log4javascript_domain=" + escape(document.domain) : "");\r
+                       };\r
+\r
+                       // Define methods and properties that vary between subclasses\r
+                       if (inPage) {\r
+                               // InPageAppender\r
+\r
+                               var containerElement = null;\r
+\r
+                               // Configuration methods. The function scope is used to prevent\r
+                               // direct alteration to the appender configuration properties.\r
+                               var cssProperties = [];\r
+                               this.addCssProperty = function(name, value) {\r
+                                       if (checkCanConfigure("cssProperties")) {\r
+                                               cssProperties.push([name, value]);\r
+                                       }\r
+                               };\r
+\r
+                               // Define useful variables\r
+                               var windowCreationStarted = false;\r
+                               var iframeContainerDiv;\r
+                               var iframeId = uniqueId + "_InPageAppender_" + consoleAppenderId;\r
+\r
+                               this.hide = function() {\r
+                                       if (initialized && consoleWindowCreated) {\r
+                                               if (consoleWindowExists()) {\r
+                                                       getConsoleWindow().$("command").blur();\r
+                                               }\r
+                                               iframeContainerDiv.style.display = "none";\r
+                                               minimized = true;\r
+                                       }\r
+                               };\r
+\r
+                               this.show = function() {\r
+                                       if (initialized) {\r
+                                               if (consoleWindowCreated) {\r
+                                                       iframeContainerDiv.style.display = "block";\r
+                                                       this.setShowCommandLine(showCommandLine); // Force IE to update\r
+                                                       minimized = false;\r
+                                               } else if (!windowCreationStarted) {\r
+                                                       createWindow(true);\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               this.isVisible = function() {\r
+                                       return !minimized && !consoleClosed;\r
+                               };\r
+\r
+                               this.close = function(fromButton) {\r
+                                       if (!consoleClosed && (!fromButton || confirm("This will permanently remove the console from the page. No more messages will be logged. Do you wish to continue?"))) {\r
+                                               iframeContainerDiv.parentNode.removeChild(iframeContainerDiv);\r
+                                               this.unload();\r
+                                       }\r
+                               };\r
+\r
+                               // Create open, init, getConsoleWindow and safeToAppend functions\r
+                               open = function() {\r
+                                       var initErrorMessage = "InPageAppender.open: unable to create console iframe";\r
+\r
+                                       function finalInit() {\r
+                                               try {\r
+                                                       if (!initiallyMinimized) {\r
+                                                               appender.show();\r
+                                                       }\r
+                                                       consoleWindowLoadHandler();\r
+                                                       consoleWindowLoaded = true;\r
+                                                       appendQueuedLoggingEvents();\r
+                                               } catch (ex) {\r
+                                                       isSupported = false;\r
+                                                       handleError(initErrorMessage, ex);\r
+                                               }\r
+                                       }\r
+\r
+                                       function writeToDocument() {\r
+                                               try {\r
+                                                       var windowTest = function(win) { return isLoaded(win); };\r
+                                                       if (useDocumentWrite) {\r
+                                                               writeHtml(getConsoleWindow().document);\r
+                                                       }\r
+                                                       if (windowTest(getConsoleWindow())) {\r
+                                                               finalInit();\r
+                                                       } else {\r
+                                                               pollConsoleWindow(windowTest, 100, finalInit, initErrorMessage);\r
+                                                       }\r
+                                               } catch (ex) {\r
+                                                       isSupported = false;\r
+                                                       handleError(initErrorMessage, ex);\r
+                                               }\r
+                                       }\r
+\r
+                                       minimized = false;\r
+                                       iframeContainerDiv = containerElement.appendChild(document.createElement("div"));\r
+\r
+                                       iframeContainerDiv.style.width = width;\r
+                                       iframeContainerDiv.style.height = height;\r
+                                       iframeContainerDiv.style.border = "solid gray 1px";\r
+\r
+                                       for (var i = 0, len = cssProperties.length; i < len; i++) {\r
+                                               iframeContainerDiv.style[cssProperties[i][0]] = cssProperties[i][1];\r
+                                       }\r
+\r
+                                       var iframeSrc = useDocumentWrite ? "" : " src='" + getConsoleUrl() + "'";\r
+\r
+                                       // Adding an iframe using the DOM would be preferable, but it doesn't work\r
+                                       // in IE5 on Windows, or in Konqueror prior to version 3.5 - in Konqueror\r
+                                       // it creates the iframe fine but I haven't been able to find a way to obtain\r
+                                       // the iframe's window object\r
+                                       iframeContainerDiv.innerHTML = "<iframe id='" + iframeId + "' name='" + iframeId +\r
+                                               "' width='100%' height='100%' frameborder='0'" + iframeSrc +\r
+                                               " scrolling='no'></iframe>";\r
+                                       consoleClosed = false;\r
+\r
+                                       // Write the console HTML to the iframe\r
+                                       var iframeDocumentExistsTest = function(win) {\r
+                                               try {\r
+                                                       return bool(win) && bool(win.document);\r
+                                               } catch (ex) {\r
+                                                       return false;\r
+                                               }\r
+                                       };\r
+                                       if (iframeDocumentExistsTest(getConsoleWindow())) {\r
+                                               writeToDocument();\r
+                                       } else {\r
+                                               pollConsoleWindow(iframeDocumentExistsTest, 100, writeToDocument, initErrorMessage);\r
+                                       }\r
+                                       consoleWindowCreated = true;\r
+                               };\r
+\r
+                               createWindow = function(show) {\r
+                                       if (show || !initiallyMinimized) {\r
+                                               var pageLoadHandler = function() {\r
+                                                       if (!container) {\r
+                                                               // Set up default container element\r
+                                                               containerElement = document.createElement("div");\r
+                                                               containerElement.style.position = "fixed";\r
+                                                               containerElement.style.left = "0";\r
+                                                               containerElement.style.right = "0";\r
+                                                               containerElement.style.bottom = "0";\r
+                                                               document.body.appendChild(containerElement);\r
+                                                               appender.addCssProperty("borderWidth", "1px 0 0 0");\r
+                                                               appender.addCssProperty("zIndex", 1000000); // Can't find anything authoritative that says how big z-index can be\r
+                                                               open();\r
+                                                       } else {\r
+                                                               try {\r
+                                                                       var el = document.getElementById(container);\r
+                                                                       if (el.nodeType == 1) {\r
+                                                                               containerElement = el;\r
+                                                                       }\r
+                                                                       open();\r
+                                                               } catch (ex) {\r
+                                                                       handleError("InPageAppender.init: invalid container element '" + container + "' supplied", ex);\r
+                                                               }\r
+                                                       }\r
+                                               };\r
+\r
+                                               // Test the type of the container supplied. First, check if it's an element\r
+                                               if (pageLoaded && container && container.appendChild) {\r
+                                                       containerElement = container;\r
+                                                       open();\r
+                                               } else if (pageLoaded) {\r
+                                                       pageLoadHandler();\r
+                                               } else {\r
+                                                       log4javascript.addEventListener("load", pageLoadHandler);\r
+                                               }\r
+                                               windowCreationStarted = true;\r
+                                       }\r
+                               };\r
+\r
+                               init = function() {\r
+                                       createWindow();\r
+                                       initialized = true;\r
+                               };\r
+\r
+                               getConsoleWindow = function() {\r
+                                       var iframe = window.frames[iframeId];\r
+                                       if (iframe) {\r
+                                               return iframe;\r
+                                       }\r
+                               };\r
+\r
+                               safeToAppend = function() {\r
+                                       if (isSupported && !consoleClosed) {\r
+                                               if (consoleWindowCreated && !consoleWindowLoaded && getConsoleWindow() && isLoaded(getConsoleWindow())) {\r
+                                                       consoleWindowLoaded = true;\r
+                                               }\r
+                                               return consoleWindowLoaded;\r
+                                       }\r
+                                       return false;\r
+                               };\r
+                       } else {\r
+                               // PopUpAppender\r
+\r
+                               // Extract params\r
+                               var useOldPopUp = appender.defaults.useOldPopUp;\r
+                               var complainAboutPopUpBlocking = appender.defaults.complainAboutPopUpBlocking;\r
+                               var reopenWhenClosed = this.defaults.reopenWhenClosed;\r
+\r
+                               // Configuration methods. The function scope is used to prevent\r
+                               // direct alteration to the appender configuration properties.\r
+                               this.isUseOldPopUp = function() { return useOldPopUp; };\r
+                               this.setUseOldPopUp = function(useOldPopUpParam) {\r
+                                       if (checkCanConfigure("useOldPopUp")) {\r
+                                               useOldPopUp = bool(useOldPopUpParam);\r
+                                       }\r
+                               };\r
+\r
+                               this.isComplainAboutPopUpBlocking = function() { return complainAboutPopUpBlocking; };\r
+                               this.setComplainAboutPopUpBlocking = function(complainAboutPopUpBlockingParam) {\r
+                                       if (checkCanConfigure("complainAboutPopUpBlocking")) {\r
+                                               complainAboutPopUpBlocking = bool(complainAboutPopUpBlockingParam);\r
+                                       }\r
+                               };\r
+\r
+                               this.isFocusPopUp = function() { return focusConsoleWindow; };\r
+                               this.setFocusPopUp = function(focusPopUpParam) {\r
+                                       // This property can be safely altered after logging has started\r
+                                       focusConsoleWindow = bool(focusPopUpParam);\r
+                               };\r
+\r
+                               this.isReopenWhenClosed = function() { return reopenWhenClosed; };\r
+                               this.setReopenWhenClosed = function(reopenWhenClosedParam) {\r
+                                       // This property can be safely altered after logging has started\r
+                                       reopenWhenClosed = bool(reopenWhenClosedParam);\r
+                               };\r
+\r
+                               this.close = function() {\r
+                                       logLog.debug("close " + this);\r
+                                       try {\r
+                                               popUp.close();\r
+                                               this.unload();\r
+                                       } catch (ex) {\r
+                                               // Do nothing\r
+                                       }\r
+                               };\r
+\r
+                               this.hide = function() {\r
+                                       logLog.debug("hide " + this);\r
+                                       if (consoleWindowExists()) {\r
+                                               this.close();\r
+                                       }\r
+                               };\r
+\r
+                               this.show = function() {\r
+                                       logLog.debug("show " + this);\r
+                                       if (!consoleWindowCreated) {\r
+                                               open();\r
+                                       }\r
+                               };\r
+\r
+                               this.isVisible = function() {\r
+                                       return safeToAppend();\r
+                               };\r
+\r
+                               // Define useful variables\r
+                               var popUp;\r
+\r
+                               // Create open, init, getConsoleWindow and safeToAppend functions\r
+                               open = function() {\r
+                                       var windowProperties = "width=" + width + ",height=" + height + ",status,resizable";\r
+                                       var frameInfo = "";\r
+                                       try {\r
+                                               var frameEl = window.frameElement;\r
+                                               if (frameEl) {\r
+                                                       frameInfo = "_" + frameEl.tagName + "_" + (frameEl.name || frameEl.id || "");\r
+                                               }\r
+                                       } catch (e) {\r
+                                               frameInfo = "_inaccessibleParentFrame";\r
+                                       }\r
+                                       var windowName = "PopUp_" + location.host.replace(/[^a-z0-9]/gi, "_") + "_" + consoleAppenderId + frameInfo;\r
+                                       if (!useOldPopUp || !useDocumentWrite) {\r
+                                               // Ensure a previous window isn't used by using a unique name\r
+                                               windowName = windowName + "_" + uniqueId;\r
+                                       }\r
+\r
+                                       var checkPopUpClosed = function(win) {\r
+                                               if (consoleClosed) {\r
+                                                       return true;\r
+                                               } else {\r
+                                                       try {\r
+                                                               return bool(win) && win.closed;\r
+                                                       } catch(ex) {}\r
+                                               }\r
+                                               return false;\r
+                                       };\r
+\r
+                                       var popUpClosedCallback = function() {\r
+                                               if (!consoleClosed) {\r
+                                                       appender.unload();\r
+                                               }\r
+                                       };\r
+\r
+                                       function finalInit() {\r
+                                               getConsoleWindow().setCloseIfOpenerCloses(!useOldPopUp || !useDocumentWrite);\r
+                                               consoleWindowLoadHandler();\r
+                                               consoleWindowLoaded = true;\r
+                                               appendQueuedLoggingEvents();\r
+                                               pollConsoleWindow(checkPopUpClosed, 500, popUpClosedCallback,\r
+                                                               "PopUpAppender.checkPopUpClosed: error checking pop-up window");\r
+                                       }\r
+\r
+                                       try {\r
+                                               popUp = window.open(getConsoleUrl(), windowName, windowProperties);\r
+                                               consoleClosed = false;\r
+                                               consoleWindowCreated = true;\r
+                                               if (popUp && popUp.document) {\r
+                                                       if (useDocumentWrite && useOldPopUp && isLoaded(popUp)) {\r
+                                                               popUp.mainPageReloaded();\r
+                                                               finalInit();\r
+                                                       } else {\r
+                                                               if (useDocumentWrite) {\r
+                                                                       writeHtml(popUp.document);\r
+                                                               }\r
+                                                               // Check if the pop-up window object is available\r
+                                                               var popUpLoadedTest = function(win) { return bool(win) && isLoaded(win); };\r
+                                                               if (isLoaded(popUp)) {\r
+                                                                       finalInit();\r
+                                                               } else {\r
+                                                                       pollConsoleWindow(popUpLoadedTest, 100, finalInit,\r
+                                                                                       "PopUpAppender.init: unable to create console window");\r
+                                                               }\r
+                                                       }\r
+                                               } else {\r
+                                                       isSupported = false;\r
+                                                       logLog.warn("PopUpAppender.init: pop-ups blocked, please unblock to use PopUpAppender");\r
+                                                       if (complainAboutPopUpBlocking) {\r
+                                                               handleError("log4javascript: pop-up windows appear to be blocked. Please unblock them to use pop-up logging.");\r
+                                                       }\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               handleError("PopUpAppender.init: error creating pop-up", ex);\r
+                                       }\r
+                               };\r
+\r
+                               createWindow = function() {\r
+                                       if (!initiallyMinimized) {\r
+                                               open();\r
+                                       }\r
+                               };\r
+\r
+                               init = function() {\r
+                                       createWindow();\r
+                                       initialized = true;\r
+                               };\r
+\r
+                               getConsoleWindow = function() {\r
+                                       return popUp;\r
+                               };\r
+\r
+                               safeToAppend = function() {\r
+                                       if (isSupported && !isUndefined(popUp) && !consoleClosed) {\r
+                                               if (popUp.closed ||\r
+                                                               (consoleWindowLoaded && isUndefined(popUp.closed))) { // Extra check for Opera\r
+                                                       appender.unload();\r
+                                                       logLog.debug("PopUpAppender: pop-up closed");\r
+                                                       return false;\r
+                                               }\r
+                                               if (!consoleWindowLoaded && isLoaded(popUp)) {\r
+                                                       consoleWindowLoaded = true;\r
+                                               }\r
+                                       }\r
+                                       return isSupported && consoleWindowLoaded && !consoleClosed;\r
+                               };\r
+                       }\r
+\r
+                       // Expose getConsoleWindow so that automated tests can check the DOM\r
+                       this.getConsoleWindow = getConsoleWindow;\r
+               };\r
+\r
+               ConsoleAppender.addGlobalCommandLineFunction = function(functionName, commandLineFunction) {\r
+                       defaultCommandLineFunctions.push([functionName, commandLineFunction]);\r
+               };\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               function PopUpAppender(lazyInit, initiallyMinimized, useDocumentWrite,\r
+                                                          width, height) {\r
+                       this.create(false, null, lazyInit, initiallyMinimized,\r
+                                       useDocumentWrite, width, height, this.defaults.focusPopUp);\r
+               }\r
+\r
+               PopUpAppender.prototype = new ConsoleAppender();\r
+\r
+               PopUpAppender.prototype.defaults = {\r
+                       layout: new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),\r
+                       initiallyMinimized: false,\r
+                       focusPopUp: false,\r
+                       lazyInit: true,\r
+                       useOldPopUp: true,\r
+                       complainAboutPopUpBlocking: true,\r
+                       newestMessageAtTop: false,\r
+                       scrollToLatestMessage: true,\r
+                       width: "600",\r
+                       height: "400",\r
+                       reopenWhenClosed: false,\r
+                       maxMessages: null,\r
+                       showCommandLine: true,\r
+                       commandLineObjectExpansionDepth: 1,\r
+                       showHideButton: false,\r
+                       showCloseButton: true,\r
+            showLogEntryDeleteButtons: true,\r
+            useDocumentWrite: true\r
+               };\r
+\r
+               PopUpAppender.prototype.toString = function() {\r
+                       return "PopUpAppender";\r
+               };\r
+\r
+               log4javascript.PopUpAppender = PopUpAppender;\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               function InPageAppender(container, lazyInit, initiallyMinimized,\r
+                                                               useDocumentWrite, width, height) {\r
+                       this.create(true, container, lazyInit, initiallyMinimized,\r
+                                       useDocumentWrite, width, height, false);\r
+               }\r
+\r
+               InPageAppender.prototype = new ConsoleAppender();\r
+\r
+               InPageAppender.prototype.defaults = {\r
+                       layout: new PatternLayout("%d{HH:mm:ss} %-5p - %m{1}%n"),\r
+                       initiallyMinimized: false,\r
+                       lazyInit: true,\r
+                       newestMessageAtTop: false,\r
+                       scrollToLatestMessage: true,\r
+                       width: "100%",\r
+                       height: "220px",\r
+                       maxMessages: null,\r
+                       showCommandLine: true,\r
+                       commandLineObjectExpansionDepth: 1,\r
+                       showHideButton: false,\r
+                       showCloseButton: false,\r
+            showLogEntryDeleteButtons: true,\r
+            useDocumentWrite: true\r
+               };\r
+\r
+               InPageAppender.prototype.toString = function() {\r
+                       return "InPageAppender";\r
+               };\r
+\r
+               log4javascript.InPageAppender = InPageAppender;\r
+\r
+               // Next line for backwards compatibility\r
+               log4javascript.InlineAppender = InPageAppender;\r
+       })();\r
+       /* ---------------------------------------------------------------------- */\r
+       // Console extension functions\r
+\r
+       function padWithSpaces(str, len) {\r
+               if (str.length < len) {\r
+                       var spaces = [];\r
+                       var numberOfSpaces = Math.max(0, len - str.length);\r
+                       for (var i = 0; i < numberOfSpaces; i++) {\r
+                               spaces[i] = " ";\r
+                       }\r
+                       str += spaces.join("");\r
+               }\r
+               return str;\r
+       }\r
+\r
+       (function() {\r
+               function dir(obj) {\r
+                       var maxLen = 0;\r
+                       // Obtain the length of the longest property name\r
+                       for (var p in obj) {\r
+                               maxLen = Math.max(toStr(p).length, maxLen);\r
+                       }\r
+                       // Create the nicely formatted property list\r
+                       var propList = [];\r
+                       for (p in obj) {\r
+                               var propNameStr = "  " + padWithSpaces(toStr(p), maxLen + 2);\r
+                               var propVal;\r
+                               try {\r
+                                       propVal = splitIntoLines(toStr(obj[p])).join(padWithSpaces(newLine, maxLen + 6));\r
+                               } catch (ex) {\r
+                                       propVal = "[Error obtaining property. Details: " + getExceptionMessage(ex) + "]";\r
+                               }\r
+                               propList.push(propNameStr + propVal);\r
+                       }\r
+                       return propList.join(newLine);\r
+               }\r
+\r
+               var nodeTypes = {\r
+                       ELEMENT_NODE: 1,\r
+                       ATTRIBUTE_NODE: 2,\r
+                       TEXT_NODE: 3,\r
+                       CDATA_SECTION_NODE: 4,\r
+                       ENTITY_REFERENCE_NODE: 5,\r
+                       ENTITY_NODE: 6,\r
+                       PROCESSING_INSTRUCTION_NODE: 7,\r
+                       COMMENT_NODE: 8,\r
+                       DOCUMENT_NODE: 9,\r
+                       DOCUMENT_TYPE_NODE: 10,\r
+                       DOCUMENT_FRAGMENT_NODE: 11,\r
+                       NOTATION_NODE: 12\r
+               };\r
+\r
+               var preFormattedElements = ["script", "pre"];\r
+\r
+               // This should be the definitive list, as specified by the XHTML 1.0 Transitional DTD\r
+               var emptyElements = ["br", "img", "hr", "param", "link", "area", "input", "col", "base", "meta"];\r
+               var indentationUnit = "  ";\r
+\r
+               // Create and return an XHTML string from the node specified\r
+               function getXhtml(rootNode, includeRootNode, indentation, startNewLine, preformatted) {\r
+                       includeRootNode = (typeof includeRootNode == "undefined") ? true : !!includeRootNode;\r
+                       if (typeof indentation != "string") {\r
+                               indentation = "";\r
+                       }\r
+                       startNewLine = !!startNewLine;\r
+                       preformatted = !!preformatted;\r
+                       var xhtml;\r
+\r
+                       function isWhitespace(node) {\r
+                               return ((node.nodeType == nodeTypes.TEXT_NODE) && /^[ \t\r\n]*$/.test(node.nodeValue));\r
+                       }\r
+\r
+                       function fixAttributeValue(attrValue) {\r
+                               return attrValue.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");\r
+                       }\r
+\r
+                       function getStyleAttributeValue(el) {\r
+                               var stylePairs = el.style.cssText.split(";");\r
+                               var styleValue = "";\r
+                               var isFirst = true;\r
+                               for (var j = 0, len = stylePairs.length; j < len; j++) {\r
+                                       var nameValueBits = stylePairs[j].split(":");\r
+                                       var props = [];\r
+                                       if (!/^\s*$/.test(nameValueBits[0])) {\r
+                                               props.push(trim(nameValueBits[0]).toLowerCase() + ":" + trim(nameValueBits[1]));\r
+                                       }\r
+                                       styleValue = props.join(";");\r
+                               }\r
+                               return styleValue;\r
+                       }\r
+\r
+                       function getNamespace(el) {\r
+                               if (el.prefix) {\r
+                                       return el.prefix;\r
+                               } else if (el.outerHTML) {\r
+                                       var regex = new RegExp("<([^:]+):" + el.tagName + "[^>]*>", "i");\r
+                                       if (regex.test(el.outerHTML)) {\r
+                                               return RegExp.$1.toLowerCase();\r
+                                       }\r
+                               }\r
+                return "";\r
+                       }\r
+\r
+                       var lt = "<";\r
+                       var gt = ">";\r
+\r
+                       if (includeRootNode && rootNode.nodeType != nodeTypes.DOCUMENT_FRAGMENT_NODE) {\r
+                               switch (rootNode.nodeType) {\r
+                                       case nodeTypes.ELEMENT_NODE:\r
+                                               var tagName = rootNode.tagName.toLowerCase();\r
+                                               xhtml = startNewLine ? newLine + indentation : "";\r
+                                               xhtml += lt;\r
+                                               // Allow for namespaces, where present\r
+                                               var prefix = getNamespace(rootNode);\r
+                                               var hasPrefix = !!prefix;\r
+                                               if (hasPrefix) {\r
+                                                       xhtml += prefix + ":";\r
+                                               }\r
+                                               xhtml += tagName;\r
+                                               for (i = 0, len = rootNode.attributes.length; i < len; i++) {\r
+                                                       var currentAttr = rootNode.attributes[i];\r
+                                                       // Check the attribute is valid.\r
+                                                       if (!   currentAttr.specified ||\r
+                                                                       currentAttr.nodeValue === null ||\r
+                                                                       currentAttr.nodeName.toLowerCase() === "style" ||\r
+                                                                       typeof currentAttr.nodeValue !== "string" ||\r
+                                                                       currentAttr.nodeName.indexOf("_moz") === 0) {\r
+                                                               continue;\r
+                                                       }\r
+                                                       xhtml += " " + currentAttr.nodeName.toLowerCase() + "=\"";\r
+                                                       xhtml += fixAttributeValue(currentAttr.nodeValue);\r
+                                                       xhtml += "\"";\r
+                                               }\r
+                                               // Style needs to be done separately as it is not reported as an\r
+                                               // attribute in IE\r
+                                               if (rootNode.style.cssText) {\r
+                                                       var styleValue = getStyleAttributeValue(rootNode);\r
+                                                       if (styleValue !== "") {\r
+                                                               xhtml += " style=\"" + getStyleAttributeValue(rootNode) + "\"";\r
+                                                       }\r
+                                               }\r
+                                               if (array_contains(emptyElements, tagName) ||\r
+                                                               (hasPrefix && !rootNode.hasChildNodes())) {\r
+                                                       xhtml += "/" + gt;\r
+                                               } else {\r
+                                                       xhtml += gt;\r
+                                                       // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                                                       var childStartNewLine = !(rootNode.childNodes.length === 1 &&\r
+                                                               rootNode.childNodes[0].nodeType === nodeTypes.TEXT_NODE);\r
+                                                       var childPreformatted = array_contains(preFormattedElements, tagName);\r
+                                                       for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                                               xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit,\r
+                                                                       childStartNewLine, childPreformatted);\r
+                                                       }\r
+                                                       // Add the end tag\r
+                                                       var endTag = lt + "/" + tagName + gt;\r
+                                                       xhtml += childStartNewLine ? newLine + indentation + endTag : endTag;\r
+                                               }\r
+                                               return xhtml;\r
+                                       case nodeTypes.TEXT_NODE:\r
+                                               if (isWhitespace(rootNode)) {\r
+                                                       xhtml = "";\r
+                                               } else {\r
+                                                       if (preformatted) {\r
+                                                               xhtml = rootNode.nodeValue;\r
+                                                       } else {\r
+                                                               // Trim whitespace from each line of the text node\r
+                                                               var lines = splitIntoLines(trim(rootNode.nodeValue));\r
+                                                               var trimmedLines = [];\r
+                                                               for (var i = 0, len = lines.length; i < len; i++) {\r
+                                                                       trimmedLines[i] = trim(lines[i]);\r
+                                                               }\r
+                                                               xhtml = trimmedLines.join(newLine + indentation);\r
+                                                       }\r
+                                                       if (startNewLine) {\r
+                                                               xhtml = newLine + indentation + xhtml;\r
+                                                       }\r
+                                               }\r
+                                               return xhtml;\r
+                                       case nodeTypes.CDATA_SECTION_NODE:\r
+                                               return "<![CDA" + "TA[" + rootNode.nodeValue + "]" + "]>" + newLine;\r
+                                       case nodeTypes.DOCUMENT_NODE:\r
+                                               xhtml = "";\r
+                                               // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                                               for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                                       xhtml += getXhtml(rootNode.childNodes[i], true, indentation);\r
+                                               }\r
+                                               return xhtml;\r
+                                       default:\r
+                                               return "";\r
+                               }\r
+                       } else {\r
+                               xhtml = "";\r
+                               // Add output for childNodes collection (which doesn't include attribute nodes)\r
+                               for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {\r
+                                       xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit);\r
+                               }\r
+                               return xhtml;\r
+                       }\r
+               }\r
+\r
+               function createCommandLineFunctions() {\r
+                       ConsoleAppender.addGlobalCommandLineFunction("$", function(appender, args, returnValue) {\r
+                               return document.getElementById(args[0]);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("dir", function(appender, args, returnValue) {\r
+                               var lines = [];\r
+                               for (var i = 0, len = args.length; i < len; i++) {\r
+                                       lines[i] = dir(args[i]);\r
+                               }\r
+                               return lines.join(newLine + newLine);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("dirxml", function(appender, args, returnValue) {\r
+                               var lines = [];\r
+                               for (var i = 0, len = args.length; i < len; i++) {\r
+                                       var win = appender.getCommandWindow();\r
+                                       lines[i] = getXhtml(args[i]);\r
+                               }\r
+                               return lines.join(newLine + newLine);\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("cd", function(appender, args, returnValue) {\r
+                               var win, message;\r
+                               if (args.length === 0 || args[0] === "") {\r
+                                       win = window;\r
+                                       message = "Command line set to run in main window";\r
+                               } else {\r
+                                       if (args[0].window == args[0]) {\r
+                                               win = args[0];\r
+                                               message = "Command line set to run in frame '" + args[0].name + "'";\r
+                                       } else {\r
+                                               win = window.frames[args[0]];\r
+                                               if (win) {\r
+                                                       message = "Command line set to run in frame '" + args[0] + "'";\r
+                                               } else {\r
+                                                       returnValue.isError = true;\r
+                                                       message = "Frame '" + args[0] + "' does not exist";\r
+                                                       win = appender.getCommandWindow();\r
+                                               }\r
+                                       }\r
+                               }\r
+                               appender.setCommandWindow(win);\r
+                               return message;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("clear", function(appender, args, returnValue) {\r
+                               returnValue.appendResult = false;\r
+                               appender.clear();\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("keys", function(appender, args, returnValue) {\r
+                               var keys = [];\r
+                               for (var k in args[0]) {\r
+                                       keys.push(k);\r
+                               }\r
+                               return keys;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("values", function(appender, args, returnValue) {\r
+                               var values = [];\r
+                               for (var k in args[0]) {\r
+                                       try {\r
+                                               values.push(args[0][k]);\r
+                                       } catch (ex) {\r
+                                               logLog.warn("values(): Unable to obtain value for key " + k + ". Details: " + getExceptionMessage(ex));\r
+                                       }\r
+                               }\r
+                               return values;\r
+                       });\r
+\r
+                       ConsoleAppender.addGlobalCommandLineFunction("expansionDepth", function(appender, args, returnValue) {\r
+                               var expansionDepth = parseInt(args[0], 10);\r
+                               if (isNaN(expansionDepth) || expansionDepth < 0) {\r
+                                       returnValue.isError = true;\r
+                                       return "" + args[0] + " is not a valid expansion depth";\r
+                               } else {\r
+                                       appender.setCommandLineObjectExpansionDepth(expansionDepth);\r
+                                       return "Object expansion depth set to " + expansionDepth;\r
+                               }\r
+                       });\r
+               }\r
+\r
+               function init() {\r
+                       // Add command line functions\r
+                       createCommandLineFunctions();\r
+               }\r
+\r
+               /* ------------------------------------------------------------------ */\r
+\r
+               init();\r
+       })();\r
+\r
+       /* ---------------------------------------------------------------------- */\r
+       // Main load\r
+\r
+   log4javascript.setDocumentReady = function() {\r
+       pageLoaded = true;\r
+       log4javascript.dispatchEvent("load", {});\r
+   };\r
+\r
+    if (window.addEventListener) {\r
+        window.addEventListener("load", log4javascript.setDocumentReady, false);\r
+    } else if (window.attachEvent) {\r
+        window.attachEvent("onload", log4javascript.setDocumentReady);\r
+    } else {\r
+        var oldOnload = window.onload;\r
+        if (typeof window.onload != "function") {\r
+            window.onload = log4javascript.setDocumentReady;\r
+        } else {\r
+            window.onload = function(evt) {\r
+                if (oldOnload) {\r
+                    oldOnload(evt);\r
+                }\r
+                log4javascript.setDocumentReady();\r
+            };\r
+        }\r
+    }\r
+\r
+    // Ensure that the log4javascript object is available in the window. This\r
+    // is necessary for log4javascript to be available in IE if loaded using\r
+    // Dojo's module system\r
+    window.log4javascript = log4javascript;\r
+\r
+    return log4javascript;\r
+})();
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/main.css b/planetstack/core/static/log4javascript-1.4.6/main.css
new file mode 100644 (file)
index 0000000..5ac3df3
--- /dev/null
@@ -0,0 +1,300 @@
+body {\r
+       font-family: Verdana, Arial, Helvetica, Sans-serif;\r
+       font-size: 75%;\r
+       color: black;\r
+       background-color: #eeeeee;\r
+       text-align: center;\r
+       padding: 0px;\r
+       margin: 0px;\r
+}\r
+\r
+div#container {\r
+       width: 770px;\r
+       text-align: left;\r
+       line-height: 150%;\r
+       border-width: 0px 1px 1px 1px;\r
+       border-color: #cccccc;\r
+       border-style: solid;\r
+       background-color: white;\r
+       color: black;\r
+       padding: 10px;\r
+       margin: 0px auto 10px auto;\r
+}\r
+\r
+div#header {\r
+       margin: 0px;\r
+}\r
+\r
+div#header h1 {\r
+       font-family: Courier New, Courier, Monospace, Serif;\r
+       padding: 8px 0 15px 0;\r
+       margin: 0px;\r
+       font-size: 200%;\r
+       font-weight: bold;\r
+       text-align: right;\r
+}\r
+\r
+div#header h1 a {\r
+       color: black;\r
+}\r
+\r
+div#nav {\r
+       font-size: 91.66%;\r
+       font-weight: bold;\r
+       padding-top: 5px;\r
+       padding-bottom: 5px;\r
+       border-bottom: solid #cccccc 1px;\r
+       text-align: right;\r
+       background-color: #f0f0fa;\r
+}\r
+\r
+div#container.nonav div#content {\r
+       float: none;\r
+       width: auto;\r
+}\r
+\r
+*.externallinkinfo {\r
+       float: right;\r
+       font-style: italic;\r
+}\r
+\r
+div#content h1 {\r
+       padding: 10px 3px 5px 3px;\r
+       margin: 5px 0px;\r
+       font-size: 175%;\r
+       font-weight: normal;\r
+}\r
+\r
+div#content h2 {\r
+       background-color: darkgreen;\r
+       color: white;\r
+       padding: 0px 3px;\r
+       font-size: 116.66%;\r
+       font-weight: bold;\r
+}\r
+\r
+div#content h2 a {\r
+       color: white;\r
+}\r
+\r
+div#content h3 {\r
+       padding: 0px 3px;\r
+       font-size: 116.66%;\r
+       font-weight: bold;\r
+       border-style: solid;\r
+       border-color: #003399;\r
+       border-width: 1px 0px;\r
+}\r
+\r
+div#content h4 {\r
+       padding: 0px 3px;\r
+       font-size: 100%;\r
+       font-weight: bold;\r
+       border-top: solid #eeeeee 1px;\r
+}\r
+\r
+div#content h5 {\r
+       padding: 0px;\r
+       margin: 3px 0px;\r
+}\r
+\r
+div#footer {\r
+       margin-top: 20px;\r
+       padding: 2px;\r
+       border-top: solid #cccccc 1px;\r
+       font-size: 91.66%;\r
+}\r
+\r
+a {\r
+       color: #003399;\r
+       text-decoration: none;\r
+}\r
+\r
+a:hover {\r
+       text-decoration: underline;\r
+}\r
+\r
+a.bold {\r
+       font-weight: bold;\r
+}\r
+\r
+a.underlined {\r
+       text-decoration: underline;\r
+}\r
+\r
+a img {\r
+       border-width: 0px;\r
+}\r
+\r
+br.clear {\r
+       clear: both;\r
+}\r
+\r
+table {\r
+       font-size: 100%;\r
+}\r
+\r
+/* Code */\r
+pre, code {\r
+       font-family: Courier New, Courier;\r
+       font-size: 108.33%;\r
+}\r
+\r
+pre.code, pre.console {\r
+       border: solid 1px #cccccc;\r
+       padding: 3px;\r
+}\r
+\r
+pre.code {\r
+       background-color: #eeeeee;\r
+}\r
+\r
+*.trace {\r
+       color: #666666;\r
+}\r
+\r
+*.debug {\r
+       color: green;\r
+}\r
+\r
+*.info {\r
+       color: #000099;\r
+}\r
+\r
+*.warn {\r
+       color: #999900;\r
+}\r
+\r
+*.error {\r
+       color: red;\r
+}\r
+\r
+*.fatal {\r
+       color: #660066;\r
+}\r
+\r
+\r
+div.example, div.panel {\r
+       border: solid 1px #cccccc;\r
+       background-color: #f5f5f5;\r
+       padding: 3px;\r
+       margin-bottom: 10px;\r
+}\r
+\r
+div.panel h2 {\r
+       margin: 5px 0px;\r
+}\r
+\r
+div.padded {\r
+       padding: 10px;\r
+}\r
+\r
+div.hidden {\r
+       display: none;\r
+}\r
+\r
+div.active {\r
+       background-color: #fcfffc;\r
+       border-color: green;\r
+}\r
+\r
+label.rightofinput, input.rightoflabel {\r
+       margin-right: 20px;\r
+}\r
+\r
+/* 'Back to top' link */\r
+p.linktotop {\r
+       text-align: right;\r
+}\r
+\r
+ul.propertieslist li.method, ul.propertieslist li.property {\r
+       margin: 0;\r
+       padding: 0px 0px 15px 0px;\r
+}\r
+\r
+ul.propertieslist li *.name {\r
+       font-size: 116.66%;\r
+       font-weight: bold;\r
+}\r
+\r
+ul.propertieslist li.method div.methodsignature {\r
+       margin: 10px 0px;\r
+       font-size: 116.66%;\r
+       background-color: #eeeeee;\r
+}\r
+\r
+ul.propertieslist li.method *.paramsheading {\r
+       font-weight: bold;\r
+}\r
+\r
+ul.propertieslist li.method *.params {\r
+       padding-top: 5px;\r
+       padding-bottom: 5px;\r
+}\r
+\r
+ul.propertieslist li.method *.params li.param {\r
+       padding-bottom: 10px;\r
+}\r
+\r
+ul.propertieslist li.method *.params li.param *.paramname {\r
+       font-style: italic;\r
+}\r
+\r
+div.serverlog {\r
+       height: 200px;\r
+       /*border: solid 1px #cccccc;*/\r
+}\r
+\r
+div#inPageConsole {\r
+       margin-top: 10px;\r
+}\r
+\r
+div.iframecontainer {\r
+       background-color: white;\r
+       border: solid #cccccc 1px;\r
+       width: 100%;\r
+}\r
+\r
+div.veryprominent {\r
+       background-color: darkgreen;\r
+       color: white;\r
+       font-weight: bold;\r
+       padding: 10px;\r
+       font-size: 133.33%;\r
+       margin-bottom: 10px;\r
+}\r
+\r
+div.veryprominent a {\r
+       color: white;\r
+}\r
+\r
+*.largetext {\r
+       font-size: 116.66%;\r
+}\r
+\r
+div#leftcolumn {\r
+       float: left;\r
+       width: 160px;\r
+}\r
+\r
+div#rightcolumn {\r
+       float: right;\r
+       width: 580px;\r
+}\r
+\r
+td.fullsupport {\r
+       background-color: lightgreen;\r
+}\r
+\r
+td.partialsupport {\r
+       background-color: gold;\r
+}\r
+\r
+td.nosupport {\r
+       background-color: lightcoral;\r
+}\r
+\r
+p.editions {\r
+       text-align: right;\r
+       font-style: italic;\r
+}
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/index.html b/planetstack/core/static/log4javascript-1.4.6/test/index.html
new file mode 100644 (file)
index 0000000..e01f13c
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - Tests</title>\r
+       </head>\r
+       <body>\r
+               <ul>\r
+                       <li><a href="log4javascript.html">Standard edition tests</a></li>\r
+                       <li><a href="log4javascript_uncompressed.html">Standard edition uncompressed tests</a></li>\r
+                       <li><a href="log4javascript_production.html">Production edition tests</a></li>\r
+                       <li><a href="log4javascript_production_uncompressed.html">Production edition uncompressed tests</a></li>\r
+               </ul>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript.html
new file mode 100644 (file)
index 0000000..8e426b9
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite.html
new file mode 100644 (file)
index 0000000..508dc83
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript_lite - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript_lite.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript_lite.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript_lite.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_lite_uncompressed.html
new file mode 100644 (file)
index 0000000..968019c
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript_lite_uncompressed - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript_lite_uncompressed.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript_lite_uncompressed.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript_lite_uncompressed.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production.html
new file mode 100644 (file)
index 0000000..e5308b1
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript_production - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript_production.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript_production.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript_production.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_production_uncompressed.html
new file mode 100644 (file)
index 0000000..21f84d7
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript_production_uncompressed - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript_production_uncompressed.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript_production_uncompressed.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript_production_uncompressed.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_uncompressed.html b/planetstack/core/static/log4javascript-1.4.6/test/log4javascript_uncompressed.html
new file mode 100644 (file)
index 0000000..3db9241
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - log4javascript_uncompressed - Tests</title>\r
+               <script type="text/javascript" src="../js/log4javascript_uncompressed.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/log4javascript_uncompressed.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/log4javascript_uncompressed.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/main.html b/planetstack/core/static/log4javascript-1.4.6/test/main.html
new file mode 100644 (file)
index 0000000..176098f
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\r
+       <head>\r
+               <title>log4javascript - %%build:edition%% - Tests</title>\r
+               <script type="text/javascript" src="../js/%%build:edition%%.js"></script>\r
+               <script type="text/javascript" src="../js/stubs/%%build:edition%%.js"></script>\r
+               <script type="text/javascript" src="xntest.js"></script>\r
+               <script type="text/javascript" src="../js/tests/%%build:edition%%.js"></script>\r
+               <link rel="stylesheet" type="text/css" href="tests.css"/>\r
+       </head>\r
+       <body>\r
+               <div id="messages"></div>\r
+               <div id="inlineAppenderContainer"></div>\r
+       </body>\r
+</html>\r
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/tests.css b/planetstack/core/static/log4javascript-1.4.6/test/tests.css
new file mode 100644 (file)
index 0000000..9cddef8
--- /dev/null
@@ -0,0 +1,88 @@
+body {\r
+       font-family: verdana, arial, helvetica, sans-serif;\r
+       font-size: 81.25%;\r
+}\r
+\r
+h2 {\r
+       font-size: 100%;\r
+       padding: 0;\r
+       margin: 0.1em 0 0.1em 0;\r
+}\r
+\r
+div.xn_test_suite_container {\r
+       border: solid #cccccc 1px;\r
+       padding: 2px 5px;\r
+       margin: 2px 0px;\r
+}\r
+\r
+div.xn_test_progressbar_container {\r
+       border: solid black 1px;\r
+}\r
+\r
+div.xn_test_progressbar_container *.success {\r
+       background-color: #00ff00;\r
+}\r
+\r
+div.xn_test_progressbar_container *.failure {\r
+       background-color: red;\r
+}\r
+\r
+div.xn_test_overallprogressbar_container {\r
+       position: relative;\r
+}\r
+\r
+div.xn_test_overallprogressbar_container h1 {\r
+       margin: 0;\r
+       padding: 2px;\r
+       font-size: 125%;\r
+       font-weight: bold;\r
+       white-space: nowrap;\r
+}\r
+\r
+dl *.success {\r
+       color: green;\r
+}\r
+\r
+dl *.failure {\r
+       color: red;\r
+}\r
+\r
+span.xn_test_expander {\r
+       padding: 0;\r
+       border: solid black 1px;\r
+       cursor: pointer;\r
+       cursor: hand;\r
+       line-height: 100%; \r
+       font-weight: bold;\r
+       margin-right: 1em;\r
+       font-size: 11px;\r
+}\r
+\r
+dl.xn_test_expanded {\r
+       display: block;\r
+}\r
+\r
+dl.xn_test_collapsed {\r
+       display: none;\r
+}\r
+\r
+div.xn_test_suite_success {\r
+       border: solid 2px limegreen;\r
+}\r
+\r
+div.xn_test_suite_failure {\r
+       border: solid 2px red;\r
+}\r
+\r
+pre.xn_test_log_report {\r
+       background-color: #f5f5f5;\r
+       padding: 3px;\r
+       border: solid gray 1px;\r
+       font-size: 11px;\r
+       font-family: Courier New, Courier, monospace;\r
+}\r
+\r
+code.xn_test_stacktrace {\r
+       color: red;\r
+       overflow: \r
+}
\ No newline at end of file
diff --git a/planetstack/core/static/log4javascript-1.4.6/test/xntest.js b/planetstack/core/static/log4javascript-1.4.6/test/xntest.js
new file mode 100644 (file)
index 0000000..1b8f475
--- /dev/null
@@ -0,0 +1,739 @@
+// Next three methods are primarily for IE5, which is missing them
+if (!Array.prototype.push) {
+       Array.prototype.push = function() {
+               for (var i = 0; i < arguments.length; i++){
+                               this[this.length] = arguments[i];
+               }
+               return this.length;
+       };
+}
+
+if (!Array.prototype.shift) {
+       Array.prototype.shift = function() {
+               if (this.length > 0) {
+                       var firstItem = this[0];
+                       for (var i = 0; i < this.length - 1; i++) {
+                               this[i] = this[i + 1];
+                       }
+                       this.length = this.length - 1;
+                       return firstItem;
+               }
+       };
+}
+
+if (!Function.prototype.apply) {
+       Function.prototype.apply = function(obj, args) {
+               var methodName = "__apply__";
+               if (typeof obj[methodName] != "undefined") {
+                       methodName += (String(Math.random())).substr(2);
+               }
+               obj[methodName] = this;
+
+               var argsStrings = new Array(args.length);
+               for (var i = 0; i < args.length; i++) {
+                       argsStrings[i] = "args[" + i + "]";
+               }
+               var script = "obj." + methodName + "(" + argsStrings.join(",") + ")";
+               var returnValue = eval(script);
+               delete obj[methodName];
+               return returnValue;
+       };
+}
+
+/* -------------------------------------------------------------------------- */
+
+var xn = new Object();
+
+(function() {
+       // Utility functions
+
+       // Event listeners
+       var getListenersPropertyName = function(eventName) {
+               return "__listeners__" + eventName;
+       };
+
+       var addEventListener = function(node, eventName, listener, useCapture) {
+               useCapture = Boolean(useCapture);
+               if (node.addEventListener) {
+                       node.addEventListener(eventName, listener, useCapture);
+               } else if (node.attachEvent) {
+                       node.attachEvent("on" + eventName, listener);
+               } else {
+                       var propertyName = getListenersPropertyName(eventName);
+                       if (!node[propertyName]) {
+                               node[propertyName] = new Array();
+
+                               // Set event handler
+                               node["on" + eventName] = function(evt) {
+                                       evt = module.getEvent(evt);
+                                       var listenersPropertyName = getListenersPropertyName(eventName);
+
+                                       // Clone the array of listeners to leave the original untouched
+                                       var listeners = cloneArray(this[listenersPropertyName]);
+                                       var currentListener;
+
+                                       // Call each listener in turn
+                                       while (currentListener = listeners.shift()) {
+                                               currentListener.call(this, evt);
+                                       }
+                               };
+                       }
+                       node[propertyName].push(listener);
+               }
+       };
+
+       // Clones an array
+       var cloneArray = function(arr) {
+               var clonedArray = [];
+               for (var i = 0; i < arr.length; i++) {
+                       clonedArray[i] = arr[i];
+               }
+               return clonedArray;
+       }
+
+       var isFunction = function(f) {
+               if (!f){ return false; }
+               return (f instanceof Function || typeof f == "function");
+       };
+
+       // CSS Utilities
+       
+       function array_contains(arr, val) {
+               for (var i = 0, len = arr.length; i < len; i++) {
+                       if (arr[i] === val) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       function addClass(el, cssClass) {
+               if (!hasClass(el, cssClass)) {
+                       if (el.className) {
+                               el.className += " " + cssClass;
+                       } else {
+                               el.className = cssClass;
+                       }
+               }
+       }
+
+       function hasClass(el, cssClass) {
+               if (el.className) {
+                       var classNames = el.className.split(" ");
+                       return array_contains(classNames, cssClass);
+               }
+               return false;
+       }
+
+       function removeClass(el, cssClass) {
+               if (hasClass(el, cssClass)) {
+                       // Rebuild the className property
+                       var existingClasses = el.className.split(" ");
+                       var newClasses = [];
+                       for (var i = 0; i < existingClasses.length; i++) {
+                               if (existingClasses[i] != cssClass) {
+                                       newClasses[newClasses.length] = existingClasses[i];
+                               }
+                       }
+                       el.className = newClasses.join(" ");
+               }
+       }
+
+       function replaceClass(el, newCssClass, oldCssClass) {
+               removeClass(el, oldCssClass);
+               addClass(el, newCssClass);
+       }
+
+       function getExceptionStringRep(ex) {
+               if (ex) {
+                       var exStr = "Exception: ";
+                       if (ex.message) {
+                               exStr += ex.message;
+                       } else if (ex.description) {
+                               exStr += ex.description;
+                       }
+                       if (ex.lineNumber) {
+                               exStr += " on line number " + ex.lineNumber;
+                       }
+                       if (ex.fileName) {
+                               exStr += " in file " + ex.fileName;
+                       }
+                       return exStr;
+               }
+               return null;
+       }
+
+
+       /* ---------------------------------------------------------------------- */
+
+       /* Configure the test logger try to use FireBug */
+       var log, error;
+       if (window["console"] && typeof console.log == "function") {
+               log = function() {
+                       if (xn.test.enableTestDebug) {
+                               console.log.apply(console, arguments);
+                       }
+               };
+               error = function() {
+                       if (xn.test.enableTestDebug) {
+                               console.error.apply(console, arguments);
+                       }
+               };
+       } else {
+               log = function() {};
+       }
+
+       /* Set up something to report to */
+
+       var initialized = false;
+       var container;
+       var progressBarContainer, progressBar, overallSummaryText;
+       var currentTest = null;
+       var suites = [];
+       var totalTestCount = 0;
+       var currentTestIndex = 0;
+       var testFailed = false;
+       var testsPassedCount = 0;
+       var startTime;
+       
+       var log4javascriptEnabled = false;
+       
+       var nextSuiteIndex = 0;
+       
+       function runNextSuite() {
+               if (nextSuiteIndex < suites.length) {
+                       suites[nextSuiteIndex++].run();
+               }
+       }
+       
+       var init = function() {
+               if (initialized) { return true; }
+               
+               container = document.createElement("div");
+               
+               // Create the overall progress bar
+               progressBarContainer = container.appendChild(document.createElement("div"));
+               progressBarContainer.className = "xn_test_progressbar_container xn_test_overallprogressbar_container";
+               progressBar = progressBarContainer.appendChild(document.createElement("div"));
+               progressBar.className = "success";
+
+               document.body.appendChild(container);
+
+               var h1 = progressBar.appendChild(document.createElement("h1"));
+               overallSummaryText = h1.appendChild(document.createTextNode(""));
+
+               initialized = true;
+               
+               // Set up logging
+               log4javascriptEnabled = !!log4javascript && xn.test.enable_log4javascript;
+               
+               function TestLogAppender() {}
+               
+               if (log4javascriptEnabled) {
+                       TestLogAppender.prototype = new log4javascript.Appender();
+                       TestLogAppender.prototype.layout = new log4javascript.PatternLayout("%d{HH:mm:ss,SSS} %-5p %m");
+                       TestLogAppender.prototype.append = function(loggingEvent) {
+                               var formattedMessage = this.getLayout().format(loggingEvent);
+                               if (this.getLayout().ignoresThrowable()) {
+                                       formattedMessage += loggingEvent.getThrowableStrRep();
+                               }
+                               currentTest.addLogMessage(formattedMessage);
+                       };
+                       
+                       var appender = new TestLogAppender();
+                       appender.setThreshold(log4javascript.Level.ALL);
+                       log4javascript.getRootLogger().addAppender(appender);
+                       log4javascript.getRootLogger().setLevel(log4javascript.Level.ALL);
+               }
+
+               startTime = new Date();
+
+               // First, build each suite
+               for (var i = 0; i < suites.length; i++) {
+                       suites[i].build();
+                       totalTestCount += suites[i].tests.length;
+               }
+               
+               // Now run each suite
+               runNextSuite();
+       };
+       
+       function updateProgressBar() {
+               progressBar.style.width = "" + parseInt(100 * (currentTestIndex) / totalTestCount) + "%";
+               var s = (totalTestCount === 1) ? "" : "s";
+               var timeTaken = new Date().getTime() - startTime.getTime();
+               overallSummaryText.nodeValue = "" + testsPassedCount + " of " + totalTestCount + " test" + s + " passed in " + timeTaken + "ms";
+       }
+
+       addEventListener(window, "load", init);
+
+       /* ---------------------------------------------------------------------- */
+
+       /* Test Suite */
+       var Suite = function(name, callback, hideSuccessful) {
+               this.name = name;
+               this.callback = callback;
+               this.hideSuccessful = hideSuccessful;
+               this.tests = [];
+               this.log = log;
+               this.error = error;
+               this.expanded = true;
+               suites.push(this);
+       }
+
+       Suite.prototype.test = function(name, callback, setUp, tearDown) {
+               this.log("adding a test named " + name)
+               var t = new Test(name, callback, this, setUp, tearDown);
+               this.tests.push(t);
+       };
+
+       Suite.prototype.build = function() {
+               // Build the elements used by the suite
+               var suite = this;
+               this.testFailed = false;
+               this.container = document.createElement("div");
+               this.container.className = "xn_test_suite_container";
+
+               var heading = document.createElement("h2");
+               this.expander = document.createElement("span");
+               this.expander.className = "xn_test_expander";
+               this.expander.onclick = function() {
+                       if (suite.expanded) {
+                               suite.collapse();
+                       } else {
+                               suite.expand();
+                       }
+               };
+               heading.appendChild(this.expander);
+               
+               this.headingTextNode = document.createTextNode(this.name);
+               heading.appendChild(this.headingTextNode);
+               this.container.appendChild(heading);
+
+               this.reportContainer = document.createElement("dl");
+               this.container.appendChild(this.reportContainer);
+
+               this.progressBarContainer = document.createElement("div");
+               this.progressBarContainer.className = "xn_test_progressbar_container";
+               this.progressBar = document.createElement("div");
+               this.progressBar.className = "success";
+               this.progressBar.innerHTML = "&nbsp;";
+               this.progressBarContainer.appendChild(this.progressBar);
+               this.reportContainer.appendChild(this.progressBarContainer);
+
+               this.expand();
+
+               container.appendChild(this.container);
+
+               // invoke callback to build the tests
+               this.callback.apply(this, [this]);
+       };
+
+       Suite.prototype.run = function() {
+               this.log("running suite '%s'", this.name)
+               this.startTime = new Date();
+
+               // now run the first test
+               this._currentIndex = 0;
+               this.runNextTest();
+       };
+
+       Suite.prototype.updateProgressBar = function() {
+               // Update progress bar
+               this.progressBar.style.width = "" + parseInt(100 * (this._currentIndex) / this.tests.length) + "%";
+               //log(this._currentIndex + ", " + this.tests.length + ", " + progressBar.style.width + ", " + progressBar.className);
+       };
+
+       Suite.prototype.expand = function() {
+               this.expander.innerHTML = "-";
+               replaceClass(this.reportContainer, "xn_test_expanded", "xn_test_collapsed");
+               this.expanded = true;
+       };
+
+       Suite.prototype.collapse = function() {
+               this.expander.innerHTML = "+";
+               replaceClass(this.reportContainer, "xn_test_collapsed", "xn_test_expanded");
+               this.expanded = false;
+       };
+
+       Suite.prototype.finish = function(timeTaken) {
+               var newClass = this.testFailed ? "xn_test_suite_failure" : "xn_test_suite_success";
+               var oldClass = this.testFailed ? "xn_test_suite_success" : "xn_test_suite_failure";
+               replaceClass(this.container, newClass, oldClass);
+
+               this.headingTextNode.nodeValue += " (" + timeTaken + "ms)";
+
+               if (this.hideSuccessful && !this.testFailed) {
+                       this.collapse();
+               }
+               runNextSuite();
+       };
+
+       /**
+        * Works recursively with external state (the next index)
+        * so that we can handle async tests differently
+        */
+       Suite.prototype.runNextTest = function() {
+               if (this._currentIndex == this.tests.length) {
+                       // finished!
+                       var timeTaken = new Date().getTime() - this.startTime.getTime();
+
+                       this.finish(timeTaken);
+                       return;
+               }
+
+               var suite = this;
+               var t = this.tests[this._currentIndex++];
+               currentTestIndex++;
+
+               if (isFunction(suite.setUp)) {
+                       suite.setUp.apply(suite, [t]);
+               }
+               if (isFunction(t.setUp)) {
+                       t.setUp.apply(t, [t]);
+               }
+
+               t._run();
+               
+               function afterTest() {
+                       if (isFunction(suite.tearDown)) {
+                               suite.tearDown.apply(suite, [t]);
+                       }
+                       if (isFunction(t.tearDown)) {
+                               t.tearDown.apply(t, [t]);
+                       }
+                       suite.log("finished test [%s]", t.name);
+                       updateProgressBar();
+                       suite.updateProgressBar();
+                       suite.runNextTest();
+               }
+               
+               if (t.isAsync) {
+                       t.whenFinished = afterTest;
+               } else {
+                       setTimeout(afterTest, 1);
+               }
+       };
+
+       Suite.prototype.reportSuccess = function() {
+       };
+
+       /* ---------------------------------------------------------------------- */
+       /**
+        * Create a new test
+        */
+       var Test = function(name, callback, suite, setUp, tearDown) {
+               this.name = name;
+               this.callback = callback;
+               this.suite = suite;
+               this.setUp = setUp;
+               this.tearDown = tearDown;
+               this.log = log;
+               this.error = error;
+               this.assertCount = 0;
+               this.logMessages = [];
+               this.logExpanded = false;
+       };
+
+       /**
+        * Default success reporter, please override
+        */
+       Test.prototype.reportSuccess = function(name, timeTaken) {
+               /* default success reporting handler */
+               this.reportHeading = document.createElement("dt");
+               var text = this.name + " passed in " + timeTaken + "ms";
+               
+               this.reportHeading.appendChild(document.createTextNode(text));
+
+               this.reportHeading.className = "success";
+               var dd = document.createElement("dd");
+               dd.className = "success";
+
+               this.suite.reportContainer.appendChild(this.reportHeading);
+               this.suite.reportContainer.appendChild(dd);
+               this.createLogReport();
+       };
+
+       /**
+        * Cause the test to immediately fail
+        */
+       Test.prototype.reportFailure = function(name, msg, ex) {
+               this.suite.testFailed = true;
+               this.suite.progressBar.className = "failure";
+               progressBar.className = "failure";
+               this.reportHeading = document.createElement("dt");
+               this.reportHeading.className = "failure";
+               var text = document.createTextNode(this.name);
+               this.reportHeading.appendChild(text);
+
+               var dd = document.createElement("dd");
+               dd.appendChild(document.createTextNode(msg));
+               dd.className = "failure";
+
+               this.suite.reportContainer.appendChild(this.reportHeading);
+               this.suite.reportContainer.appendChild(dd);
+               if (ex && ex.stack) {
+                       var stackTraceContainer = this.suite.reportContainer.appendChild(document.createElement("code"));
+                       stackTraceContainer.className = "xn_test_stacktrace";
+                       stackTraceContainer.innerHTML = ex.stack.replace(/\r/g, "\n").replace(/\n{1,2}/g, "<br />");
+               }
+               this.createLogReport();
+       };
+       
+       Test.prototype.createLogReport = function() {
+               if (this.logMessages.length > 0) {
+                       this.reportHeading.appendChild(document.createTextNode(" ("));
+                       var logToggler = this.reportHeading.appendChild(document.createElement("a"));
+                       logToggler.href = "#";
+                       logToggler.innerHTML = "show log";
+                       var test = this;
+                       
+                       logToggler.onclick = function() {
+                               if (test.logExpanded) {
+                                       test.hideLogReport();
+                                       this.innerHTML = "show log";
+                                       test.logExpanded = false;
+                               } else {
+                                       test.showLogReport();
+                                       this.innerHTML = "hide log";
+                                       test.logExpanded = true;
+                               }
+                               return false;
+                       };
+
+                       this.reportHeading.appendChild(document.createTextNode(")"));
+                       
+                       // Create log report
+                       this.logReport = this.suite.reportContainer.appendChild(document.createElement("pre"));
+                       this.logReport.style.display = "none";
+                       this.logReport.className = "xn_test_log_report";
+                       var logMessageDiv;
+                       for (var i = 0, len = this.logMessages.length; i < len; i++) {
+                               logMessageDiv = this.logReport.appendChild(document.createElement("div"));
+                               logMessageDiv.appendChild(document.createTextNode(this.logMessages[i]));
+                       }
+               }
+       };
+
+       Test.prototype.showLogReport = function() {
+               this.logReport.style.display = "inline-block";
+       };
+               
+       Test.prototype.hideLogReport = function() {
+               this.logReport.style.display = "none";
+       };
+
+       Test.prototype.async = function(timeout, callback) {
+               timeout = timeout || 250;
+               var self = this;
+               var timedOutFunc = function() {
+                       if (!self.completed) {
+                               var message = (typeof callback === "undefined") ?
+                                                       "Asynchronous test timed out" : callback(self);
+                               self.fail(message);
+                       }
+               }
+               var timer = setTimeout(function () { timedOutFunc.apply(self, []); }, timeout)
+               this.isAsync = true;
+       };
+
+       /**
+        * Run the test
+        */
+       Test.prototype._run = function() {
+               this.log("starting test [%s]", this.name);
+               this.startTime = new Date();
+               currentTest = this;
+               try {
+                       this.callback(this);
+                       if (!this.completed && !this.isAsync) {
+                               this.succeed();
+                       }
+               } catch (e) {
+                       this.log("test [%s] threw exception [%s]", this.name, e);
+                       var s = (this.assertCount === 1) ? "" : "s";
+                       this.fail("Exception thrown after " + this.assertCount + " successful assertion" + s + ": " + getExceptionStringRep(e), e);
+               }
+       };
+
+       /**
+        * Cause the test to immediately succeed
+        */
+       Test.prototype.succeed = function() {
+               if (this.completed) { return false; }
+               // this.log("test [%s] succeeded", this.name);
+               this.completed = true;
+               var timeTaken = new Date().getTime() - this.startTime.getTime();
+               testsPassedCount++;
+               this.reportSuccess(this.name, timeTaken);
+               if (this.whenFinished) {
+                       this.whenFinished();
+               }
+       };
+
+       Test.prototype.fail = function(msg, ex) {
+               if (typeof msg != "string") {
+                       msg = getExceptionStringRep(msg);
+               }
+               if (this.completed) { return false; }
+               this.completed = true;
+               // this.log("test [%s] failed", this.name);
+               this.reportFailure(this.name, msg, ex);
+               if (this.whenFinished) {
+                       this.whenFinished();
+               }
+       };
+       
+       Test.prototype.addLogMessage = function(logMessage) {
+               this.logMessages.push(logMessage);
+       };
+
+       /* assertions */
+       var displayStringForValue = function(obj) {
+               if (obj === null) {
+                       return "null";
+               } else if (typeof obj === "undefined") {
+                       return "undefined";
+               }
+               return obj.toString();
+       };
+
+       var assert = function(args, expectedArgsCount, testFunction, defaultComment) {
+               this.assertCount++;
+               var comment = defaultComment;
+               var i;
+               var success;
+               var values = [];
+               if (args.length == expectedArgsCount) {
+                       for (i = 0; i < args.length; i++) {
+                               values[i] = args[i];
+                       }
+               } else if (args.length == expectedArgsCount + 1) {
+                       comment = args[0];
+                       for (i = 1; i < args.length; i++) {
+                               values[i - 1] = args[i];
+                       }
+               } else {
+                       throw new Error("Invalid number of arguments passed to assert function");
+               }
+               success = testFunction(values);
+               if (!success) {
+                       var regex = /\{([0-9]+)\}/;
+                       while (regex.test(comment)) {
+                               comment = comment.replace(regex, displayStringForValue(values[parseInt(RegExp.$1)]));
+                       }
+                       this.fail("Test failed on assertion " + this.assertCount + ": " + comment);
+               }
+       };
+
+       var testNull = function(values) {
+               return (values[0] === null);
+       };
+
+       Test.prototype.assertNull = function() {
+               assert.apply(this, [arguments, 1, testNull, "Expected to be null but was {0}"]);
+       }
+
+       var testNotNull = function(values) {
+               return (values[0] !== null);
+       };
+
+       Test.prototype.assertNotNull = function() {
+               assert.apply(this, [arguments, 1, testNotNull, "Expected not to be null but was {0}"]);
+       }
+
+       var testBoolean = function(values) {
+               return (Boolean(values[0]));
+       };
+
+       Test.prototype.assert = function() {
+               assert.apply(this, [arguments, 1, testBoolean, "Expected not to be equivalent to false"]);
+       };
+
+       var testTrue = function(values) {
+               return (values[0] === true);
+       };
+
+       Test.prototype.assertTrue = function() {
+               assert.apply(this, [arguments, 1, testTrue, "Expected to be true but was {0}"]);
+       };
+
+       Test.prototype.assert = function() {
+               assert.apply(this, [arguments, 1, testTrue, "Expected to be true but was {0}"]);
+       };
+
+       var testFalse = function(values) {
+               return (values[0] === false);
+       };
+
+       Test.prototype.assertFalse = function() {
+               assert.apply(this, [arguments, 1, testFalse, "Expected to be false but was {0}"]);
+       }
+
+       var testEquivalent = function(values) {
+               return (values[0] === values[1]);
+       };
+
+       Test.prototype.assertEquivalent = function() {
+               assert.apply(this, [arguments, 2, testEquivalent, "Expected to be equal but values were {0} and {1}"]);
+       }
+
+       var testNotEquivalent = function(values) {
+               return (values[0] !== values[1]);
+       };
+
+       Test.prototype.assertNotEquivalent = function() {
+               assert.apply(this, [arguments, 2, testNotEquivalent, "Expected to be not equal but values were {0} and {1}"]);
+       }
+
+       var testEquals = function(values) {
+               return (values[0] == values[1]);
+       };
+
+       Test.prototype.assertEquals = function() {
+               assert.apply(this, [arguments, 2, testEquals, "Expected to be equal but values were {0} and {1}"]);
+       }
+
+       var testNotEquals = function(values) {
+               return (values[0] != values[1]);
+       };
+
+       Test.prototype.assertNotEquals = function() {
+               assert.apply(this, [arguments, 2, testNotEquals, "Expected to be not equal but values were {0} and {1}"]);
+       }
+
+       var testRegexMatches = function(values) {
+               return (values[0].test(values[1]));
+       };
+
+       Test.prototype.assertRegexMatches = function() {
+               assert.apply(this, [arguments, 2, testRegexMatches, "Expected regex {0} to match value {1} but it didn't"]);
+       }
+
+       Test.prototype.assertError = function(f, errorType) {
+               try {
+                       f();
+                       this.fail("Expected error to be thrown");
+               } catch (e) {
+                       if (errorType && (!(e instanceof errorType))) {
+                               this.fail("Expected error of type " + errorType + " to be thrown but error thrown was " + e);
+                       }
+               }
+       };
+
+       /**
+        * Execute a synchronous test
+        */
+       xn.test = function(name, callback) {
+               xn.test.suite("Anonymous", function(s) {
+                       s.test(name, callback);
+               });
+       }
+
+       /**
+        * Create a test suite with a given name
+        */
+       xn.test.suite = function(name, callback, hideSuccessful) {
+               var s = new Suite(name, callback, hideSuccessful);
+       }
+})();
\ No newline at end of file
diff --git a/planetstack/core/static/main.js b/planetstack/core/static/main.js
new file mode 100644 (file)
index 0000000..486d65a
--- /dev/null
@@ -0,0 +1,153 @@
+$(document).ready(function() {
+
+       
+       function getServerData(url, label, value) {
+               var jqxhr = $.getJSON( url, function(data) {
+                       if (value == 'nodesValue') {
+                               var unit = '';
+                               window.nodesCnt = data;
+                       } else if (value == 'cpuValue'){
+                               var unit = '%';
+                               window.cpuCnt = data;
+                       } else if (value == 'bandwidthValue'){
+                               var unit = '';
+                               window.bandData = data;
+                       }
+                       var legend = data.legend;
+                       var data = data.data;
+                       var dataLength = data.length - 1;
+                       $('.'+label).text(legend).show();
+                       $('.'+value).text(Math.round(data[dataLength][1])+unit).show();
+               })
+               
+       }
+       var selectedNodeTxt = $('.currentOriginalNode').text();
+       selectedNodeTxt = selectedNodeTxt.trim();
+       selectedNodeTxt = selectedNodeTxt.split(' ').join('');//selectedNodeTxt.replace(" ", "")
+       var parentNodeTxt = $('.selectedMainNav').text();
+       parentNodeTxt = parentNodeTxt.replace("/\n","");
+       parentNodeTxt = parentNodeTxt.replace("»","");
+       parentNodeTxt = parentNodeTxt.trim();
+       
+       baseNodeQuery = 'SELECT Minute(time) as Minute,COUNT(distinct %hostname) FROM [vicci.demoevents]';
+       baseCpuQuery = 'SELECT Minute(time) as Minute,AVG(i0) as Cpu FROM [vicci.demoevents]';
+       baseBwQuery = 'SELECT Minute(time) as Minute,AVG(i1) as Requests FROM [vicci.demoevents]';
+       groupByClause = ' GROUP BY Minute ORDER BY Minute';
+
+       if (selectedNodeTxt ) {
+               if (parentNodeTxt.length > 0 && parentNodeTxt.charAt(parentNodeTxt.length-1)=='s') {
+                       parentNodeTxt = parentNodeTxt.substring(0, parentNodeTxt.length-1);
+               }
+               if (parentNodeTxt=='Slice') {
+                       whereClause = " WHERE s3='"+selectedNodeTxt+"'";
+               } 
+               else if (parentNodeTxt=='Site') {
+                       whereClause = " WHERE s2='"+selectedNodeTxt+"' OR %hostname CONTAINS '"+selectedNodeTxt+"'";
+               } 
+               else if (parentNodeTxt=='Node') {
+                       whereClause = " WHERE %hostname='"+selectedNodeTxt+"'";
+                       alert(whereClause);
+               } else {
+                       console.log('Error: Unkown object type:'+parentNodeTxt);
+               }
+       } else {
+               whereClause = '';
+       }
+       finalNodeQuery = encodeURIComponent(baseNodeQuery + whereClause + groupByClause);
+       finalCpuQuery = encodeURIComponent(baseCpuQuery + whereClause + groupByClause);
+       finalBwQuery = encodeURIComponent(baseBwQuery + whereClause + groupByClause);
+       getServerData('http://cloud-scrutiny.appspot.com/command?action=send_query&legend=Node+Count&tqx=saber&q='+finalNodeQuery,'nodesLabel','nodesValue');
+       getServerData('http://cloud-scrutiny.appspot.com/command?action=send_query&legend=Load&tqx=saber&q='+finalCpuQuery,'cpuLabel','cpuValue');
+       getServerData('http://cloud-scrutiny.appspot.com/command?action=send_query&legend=Bandwidth&tqx=saber&q='+finalBwQuery,'bandwidthLabel','bandwidthValue');
+
+       $('.nodesLabel, .nodesValue').click(function() {
+               var jsonData = window.nodesCnt;
+               renderChart(jsonData);
+       });
+       $('.cpuLabel, .cpuValue').click(function() {
+               var jsonData = window.cpuCnt;
+               renderChart(jsonData);
+       });
+       $('.bandwidthLabel, .bandwidthValue').click(function() {
+               var jsonData = window.bandData;
+               renderChart(jsonData);
+       });
+
+       function renderChart(jsonData) {
+               $('#graph').empty();
+               $('#chartsModal').modal('show');
+               $('.modal-body').scrollTop(0)
+               var margin = {top: 0, right: 100, bottom: 100, left: 175},
+               width = 520 - margin.left - margin.right,
+               height = 300 - margin.top - margin.bottom;
+
+               var parseDate = d3.time.format("%Y-%m-%m-%H-%M").parse;
+
+               var x = d3.time.scale()
+               .range([0, width]);
+
+               var y = d3.scale.linear()
+               .range([height, 0]);
+
+               var xAxis = d3.svg.axis()
+               .scale(x)
+               .ticks(d3.time.minutes, 15)
+               .orient("bottom");
+
+               var yAxis = d3.svg.axis()
+               .scale(y)
+               .ticks(4)
+               .orient("left");
+
+               var line = d3.svg.line()
+               .x(function(d) { return x(d.date); })
+               .y(function(d) { return y(d.value); });
+
+               var svg = d3.select("#graph").append("svg")
+               .attr("width", width + margin.left + margin.right)
+               .attr("height", height + margin.top + margin.bottom)
+               .append("g")
+               .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+               /*var data_path = "http://sabertooth.cs.princeton.edu/graphs/UpNodes";
+               d3.json(data_path, function(error, input) {*/
+                       //jsonData = JSON.stringify(eval("(" + jsonData + ")"));
+                       data = jsonData.data;//input['data'];
+                       legend = jsonData.legend;//input['legend']
+                       $('#chartHeading').text(legend);
+                       data.forEach(function(d) {
+                               d.date = new Date(d[0]*1000);
+                               d.value = +d[1];
+                               });
+                                       x.domain(d3.extent(data, function(d) { return d.date; }));
+
+                                       var e = d3.extent(data, function(d) { return d.value;});
+                                       e = [e[0]-1,e[1]+1];
+
+                                       y.domain(e);
+
+                                       svg.append("g")
+                                       .attr("class", "x axis")
+                                       .attr("transform", "translate(0," + height + ")")
+                                       .attr("x", 5)
+                                       .call(xAxis);
+
+                                       svg.append("g")
+                                       .attr("class", "y axis")
+                                       .call(yAxis)
+                                       .append("text")
+                                       .attr("transform", "rotate(-90)")
+                                       .attr("y", 6)
+                                       .attr("dy", ".71em")
+                                       .style("text-anchor", "end")
+                                       .text(legend)
+                                       .attr("class", "legend");
+
+                                       svg.append("path")
+                                       .datum(data)
+                                       .attr("class", "line")
+                                       .attr("d", line);
+                               //});
+       }
+
+})
diff --git a/planetstack/core/static/page_analytics.js b/planetstack/core/static/page_analytics.js
new file mode 100644 (file)
index 0000000..bf7e37d
--- /dev/null
@@ -0,0 +1,129 @@
+function getPageKind() {
+    var parentNodeTxt = $('#selectedMainNav').text();
+    parentNodeTxt = parentNodeTxt.replace("/\n","");
+    parentNodeTxt = parentNodeTxt.replace("»","");
+    parentNodeTxt = parentNodeTxt.trim();
+    if (parentNodeTxt.length > 0 && parentNodeTxt.charAt(parentNodeTxt.length-1)=='s') {
+            parentNodeTxt = parentNodeTxt.substring(0, parentNodeTxt.length-1);
+    }
+    return parentNodeTxt;
+}
+
+function getObjectQuery() {
+    var selectedNodeTxt = $('#currentOriginalNode').text();
+    selectedNodeTxt = selectedNodeTxt.trim();
+    selectedNodeTxt = selectedNodeTxt.split(' ').join('');//selectedNodeTxt.replace(" ", "")
+    parentNodeTxt = getPageKind();
+
+    if (parentNodeTxt == "Slice") {
+        return "&slice=" + selectedNodeTxt;
+    } else if (parentNodeTxt == "Site") {
+        return "&site=" + selectedNodeTxt;
+    } else if (parentNodeTxt == "Node") {
+        return "&node=" + selectedNodeTxt;
+    } else {
+        return "";
+    }
+}
+
+
+function setPageStatInt(labelName, valueName, legend, units, value) {
+    $(labelName).text(legend).show();
+    $(valueName).text(Math.round(value)+units).show();
+}
+
+function setPageStatFloat(labelName, valueName, legend, units, value, dp) {
+    $(labelName).text(legend).show();
+    $(valueName).text(Number(value).toFixed(dp)+units).show();
+}
+
+// ----------------------------------------------------------------------------
+// node count and average cpu utilization
+
+function updatePageAnalyticsData(summaryData) {
+    window.pageAnalyticsUrl = summaryData["dataSourceUrl"];
+    lastRow = summaryData.rows.length-1;
+
+    if (summaryData.msg) {
+        $("#minidashStatus").text(summaryData.msg).show();
+    } else {
+        $("#minidashStatus").text("").hide();
+    }
+
+    if (summaryData.rows.length <= 0) {
+        //console.log("no data received from page analytics ajax")
+        return;
+    }
+
+    //Old minidashboard
+    //setPageStatInt(".nodesLabel", ".nodesValue", "Node Count", "", summaryData.rows[lastRow]["count_hostname"]);
+    //setPageStatInt(".cpuLabel", ".cpuValue", "Avg Load", "%", summaryData.rows[lastRow]["avg_cpu"]);
+
+    //New miniDashboard
+    setPageStatInt("#miniDashNodeCountLabel", "#miniDashNodeCount", "Node Count", "", summaryData.rows[lastRow]["count_hostname"]);
+    setPageStatInt("#miniDashAvgLoadLabel", "#miniDashAvgLoad", "Avg Load", "%", summaryData.rows[lastRow]["avg_cpu"]);
+}
+
+function updatePageAnalytics() {
+    var url= '/analytics/bigquery/?avg=%cpu&count=%hostname&cached=default' + getObjectQuery();
+    $.ajax({
+    url: url,
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData) {
+        updatePageAnalyticsData(newData);
+        setTimeout(updatePageAnalytics, 30000);
+    },
+    error: function() {
+        console.log("error retrieving statistics; retry in 5 seconds");
+        setTimeout(updatePageBandwidth, 5000);
+    }
+});
+}
+
+// ----------------------------------------------------------------------------
+// bandwidth
+
+function updatePageBandwidthData(summaryData) {
+    window.pageBandwidthUrl = summaryData["dataSourceUrl"];
+    lastRow = summaryData.rows.length-1;
+
+    if (summaryData.rows.length <= 0) {
+        //console.log("no data received from page bandwidth ajax")
+        return;
+    }
+
+    //Old minidashboard
+    //setPageStatFloat(".bandwidthLabel", ".bandwidthValue", "Bandwidth", " Gbps", summaryData.rows[lastRow]["sum_computed_bytes_sent_div_elapsed"]*8.0/1024/1024/1024,2);
+
+    //New minidashboard
+    setPageStatFloat("#miniDashBandwidthLabel", "#miniDashBandwidth", "Bandwidth", " Gbps", summaryData.rows[lastRow]["sum_computed_bytes_sent_div_elapsed"]*8.0/1024/1024/1024,2);
+}
+
+function updatePageBandwidth() {
+    var url='/analytics/bigquery/?computed=%bytes_sent/%elapsed&cached=default' + getObjectQuery();
+
+    if (getPageKind()!="Slice") {
+        url = url + "&event=node_heartbeat";
+    }
+
+    $.ajax({
+    url : url,
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData) {
+        updatePageBandwidthData(newData);
+        setTimeout(updatePageBandwidth, 30000);
+    },
+    error: function() {
+        console.log("error retrieving statistics; retry in 5 seconds")
+        setTimeout(updatePageBandwidth, 5000);
+    }
+});
+}
+
+$( document ).ready(function() {
+    updatePageAnalytics();
+    updatePageBandwidth();
+});\r
+
index 873a9d9..44d62b4 100644 (file)
@@ -1,3 +1,242 @@
+/*************************
+colors:
+    tab - active/focus color
+    background-color: #105E9E !important;
+
+ONLab darker blue select :: background-color: #004775;
+#0170BB
+    left-nav
+    background-color: #448CCA;
+    background-color // normal: #B4CADF
+91BFE4
+
+*************************/
+
+/*   CSS for jquery Tabs */
+#hometabs {
+border-bottom: 1px solid #105E9E;
+font-size: 12px;
+border: 0px;
+}
+
+.ui-tabs-active {
+    color: #ffffff;
+    background-color: #105E9E;
+    text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+    font-weight: normal;
+}
+.nav > li > a:active {
+    color: #ffffff;
+    background-color: #105E9E;
+    text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+    
+}
+.nav > li > a:focus {
+    color: #ffffff;
+    background-color: #105E9E;
+    text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+    
+}
+.ui-state-focus a,
+.ui-state-focus a:link{
+    color: #ffffff;
+    background-color: #105E9E;
+    text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+}
+.ui-state-active a,
+.ui-state-active a:link{
+    color: #ffffff !important;
+    background-color: #105E9E !important;
+    text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+    font-weight: normal;
+}
+/*************************/
+/*  Header elements      */
+
+.logo {
+}
+.header{
+    background-color: #ffffff !important;
+    /*background-image: url('bg2.jpg');*/
+    background-size: 100% auto;
+    background-image: none !important;
+    text-shadow: none;
+    border-bottom: 3px solid #C5CCD4;
+    margin-bottom: 14px;
+    margin-top: -120px;
+    height: 85px;
+    /*min-width: 1321px;*/
+}
+
+.nav-quick-search{
+margin: 30px -10px 0px 0px !important;
+padding:0 25px 0 0 !important;
+float:right !important;
+}
+
+.nav-quick-search .search-query{
+border-radius:5px;
+border:none;
+box-shadow:0px;
+background-color:lightGrey;
+padding-left: 27px;
+}
+
+
+.header #branding {
+width: 100%;
+height:60px;
+}
+
+.header a {
+color: #08C;
+font-weight: bold;
+/*border-bottom: 1px solid #C5CCD4;*/
+}
+a {
+color: #08C;
+font-weight: bold;
+/*border-bottom: 1px solid #C5CCD4;*/
+}
+
+.header #branding {
+border-right:none;
+}
+
+#branding2{
+height:20px;
+width:100%;
+color: #333;
+/*background-color: #000000;*/
+margin-bottom: 10px;
+}
+
+.header #user-tools {
+    padding: 12px 20px 0px 0px;
+    float: right;
+    margin-top: -5px;
+}
+
+.header .header-content .date{
+padding-left:10px;
+}
+
+.header .header-content .time {
+font-weight: normal;
+}
+.header .header-content.header-content-first{
+height: 15px;
+padding-bottom: 0px;
+}
+
+.header .header-content {
+padding-bottom: 0px;
+padding: 7px 0 0 0px;
+}
+
+/*************************/
+
+.alignCenter {
+    text-align: center !important;
+    align: center !important;
+}
+table.dataTable tr.odd {
+background-color: white !important;
+}
+table.dataTable tr.odd td.sorting_1 {
+background-color: white !important;
+}
+table.dataTable tr.even td.sorting_1 {
+background-color: white !important;
+}
+table.dataTable thead th div.DataTables_sort_wrapper {
+    font-weight: bold;
+}
+.dashboard-hpc-sliver .ui-widget-header, .dashboard-hpc-sliver .ui-dialog-title, .dashboard-hpc-sliver .ui-dialog-titlebar{
+}
+.ui-widget-overlay {
+    background: black !important;
+}
+.ui-corner-all {
+border-bottom-left-radius: 0px !important;
+border-bottom-right-radius: 0px !important;
+}
+
+#suit-center {
+  /* min-width: 977px !important; */
+}
+#openCloudTopPage {
+   margin-top: -25px;
+   margin-right: -90;
+   float: right;
+}
+#minDashboard {
+  /*min-width:625px; */
+  display:inline;
+  float: right;
+  border: 2px darkGrey;
+}
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default{
+background: none !important;
+border-top: 0px !important;
+border-left: 0px !important;
+border-right: 0px !important;
+}
+.ui-widget-header {
+background: none !important;
+border-top: 0px !important;
+border-left: 0px !important;
+border-right: 0px !important;
+}
+#suit_form_tabs {
+/*border-bottom: 1px solid #B5D1EA;*/
+border-bottom: 1px solid #105E9E !important;
+border-bottom-width: 5px !important;
+border-bottom-style: solid;
+/*border-bottom-color: rgb(181, 209, 234);*/
+border-bottom-color: #448CCA;
+color:#105E9E;
+}
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited {
+color: #105E9E ;
+}
+.save-box {
+  background-color: #ffffff;
+  margin: 2px;
+}
+.save-box .btn-info {
+  font-size: 14px;
+  padding: 10px 20px 10px 20px;
+}
+.btn-success {
+  font-size: 12px;
+  font-weight: normal;
+  padding: 5px 10px 5px 10px;
+}
+.btn-success, .save-box .btn-info {
+  background: #27AE5F;
+  background-image: -webkit-linear-gradient(top, #27AE5F, #27ae60);
+  background-image: -moz-linear-gradient(top, #27AE5F, #27ae60);
+  background-image: -ms-linear-gradient(top, #27AE5F, #27ae60);
+  background-image: -o-linear-gradient(top, #27AE5F, #27ae60);
+  background-image: linear-gradient(to bottom, #27AE5F, #27ae60);
+  -webkit-border-radius: 5;
+  -moz-border-radius: 5;
+  border-radius: 5px;
+  text-shadow: 1px 1px 3px #666666;
+  font-family: Arial;
+  color: #ffffff;
+  text-decoration: none;
+  letter-spacing: 1px;
+}
+
+.btn-success:hover, .save-box .btn-info:hover {
+  background: #2ecc71;
+  text-decoration: none;
+}
+
+
+
 .required:after {color: red ! important; font-size: 18px }
 #.btn-success {color:black}
 #suit-center {
@@ -6,9 +245,10 @@ width: 100%;
 min-width:650px;
 }
 .inner-two-columns .inner-center-column .tab-content {
-overflow: inherit;
+overflow-x: auto;
 margin-bottom: 15px;
-min-width: 650px;
+/*min-width: auto;*/
+width:100%;
 }
 .inner-two-columns .inner-center-column {
 #margin-right: 200px;
@@ -21,20 +261,24 @@ margin-bottom: 5px;
 }
 
 
-/*Added by Beena*/
-/*For increasing the header height*/
-.header {
-height: 90px;
-}
-
 /*For changing the background color of the left side navigation list items*/
 /*For changing the color of the left side navigation list items*/
 /*For changing the font of the left side navigation list items*/
 .left-nav>ul>li>a {
-background-color: #CDE7FF;
-font-weight: bold;
-color: #105E9E;
-font-size: 13px;
+/*background-color: #CDE7FF;*/
+/* Light color nav choices */
+/*background-color: #DFECF8;*/
+/*background-color: #91BFE4;*/
+/*background-color: #DAECFC;*/
+background-color: #448CCA;
+/*ONlab.us reg color blue*/
+/*background-color: #ccffff;*/
+font-weight: normal;
+/*color: #105E9E;*/
+color: #ffffff;
+text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+letter-spacing: 1px;
+font-size: 12px;
 border-bottom: none;
 }
 
@@ -47,16 +291,24 @@ padding-left: 5px;
 .left-nav>ul>li {
 padding-top:4px;
 line-height: 35px;
-width: 180px;
+width: 200px;
 }
 
-/*For changing background color of suit enter*/
+/*For changing background color of suit center*/
 #suit-center {
 background-color: #ffffff;
 }
 
 .left-nav>ul>li.active>a {
-background-color: #448CCA;
+/*background-color: #448CCA;*/
+/* Last Active
+background-color: #0061B7; */
+background-color: #515151;
+/*background-color: #448CCA;*/
+font-weight:normal;
+color:#ffffff;
+text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+letter-spacing: 1px;
 
 left: 10px;
 background-image: url("right_arrow.png");
@@ -65,33 +317,49 @@ background-image: url("right_arrow.png");
 
 
 .nav-tabs-suit li{
-background-color: #CDE7FF;
-/*background-color: #FFFFFF;*/
+/*background-color: #CDE7FF;*/
+background-color: #FFFFFF;
+border-top-left-radius: 3px;
+border-top-right-radius: 3px;
+border-bottom-left-radius: 0px;
+border-bottom-right-radius: 0px;
 }
 
 .nav-tabs-suit li a {
-background-color: #CDE7FF;
-font-weight: bold;
+background-color: 
+/*background-color: #CDE7FF;*/
+font-weight: normal;
 color: #105E9E;
-border-radius: 0px;
+/*border-radius: 3px;*/
+border-top-left-radius: 3px;
+border-top-right-radius: 3px;
+border-bottom-left-radius: 0px;
+border-bottom-right-radius: 0px;
 border: none;
 box-shadow: none;
 }
+
 .nav-tabs-suit li.active{
 /*Changed on Dec 11*/
-background-color: #448CCA;
-     /*background-position: 50% 100%; 
-background-image:url('donw_arrow.png');*/
+/*background-color: #448CCA;*/
+     background-position: 50% 100%; 
+background-image:url('down_arrow.png');
 }
 
 .nav-tabs-suit li.hover{
 /*Changed on Dec 11*/
-background-color: #448CCA;
+/*background-color: #448CCA;*/
+color:#ffffff;
+/*font-size: 1.2em;*/
+font-weight: bold;
 }
 
 .nav-tabs-suit li.active a {
-background-color: #448CCA;
+background-color: #ffffff;
+/*background-color: #448CCA;*/
+background-color: #105E9E;
 color:#ffffff;
+font-weight:normal;
 padding-top:10px;
 text-decoration:none;
 }
@@ -111,32 +379,49 @@ line-height: 0;
 
 
 .left-nav>ul>li.active>a:hover{
-background-color: #448CCA;
+/*background-color: #448CCA;*/
+/*background-color: #91BFE4;*/
+/*background-color: #D6E7F8;*/
+font-weight:normal;
+font-size: 1.2em;
+font-weight: bold;
 color:#ffffff;
-/*padding-top:10px;*/
+padding-top:10px;
 text-decoration:none;
 }
 
+/* Adjust font weight to normal on hover, else white blurs */
 .left-nav>ul>li>a:hover{
-background-color: #448CCA;
+/*background-color: #448CCA;*/
+/*background-color: #004775;*/
+background-color: #515151;
 color:#ffffff;
+font-weight:normal;
+font-size: 1.2em;
 /*padding-top:10px;*/
 text-decoration:none;
-border-left: 15px solid #105E9E ;
+/*border-left: 15px solid #105E9E ;*/
+border-left: 10px solid #ffffff;
+text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+letter-spacing: 1px;
 }
 .nav-tabs-suit li.active a:hover,.nav-tabs-suit li a:hover{
-background-color: #448CCA;
-color:#ffffff;
+/*background-color: #448CCA;*/
+background-color: #515151;
+font-weight:normal;
+font-size: 1.2em;
+/*color:#ffffff;*/
 padding-top:10px;
 text-decoration:none;
 }
 
 .breadcrumb li a {
-font-weight:bold;
+/*font-weight:bold;*/
 }
 
 .nav-tabs {
-border-bottom: 1px solid #B5D1EA;
+/*
+border-bottom: 1px solid #B5D1EA;*/
 }
 
 .nav-tabs>li {
@@ -163,53 +448,11 @@ vertical-align: middle;
 */
 
 
-.header #branding{
-height:60px;
-}
-
-#branding2{
-padding-top:60px;
-height:20px;
-width:100%;
-/*background-color: #000000;*/
-/*margin-bottom: 10px;*/
-}
-.header .header-content .date{
-padding-left:10px;
-}
-
-.header .header-content .time {
-font-weight: normal;
-}
-.header .header-content.header-content-first{
-height: 15px;
-padding-bottom: 0px;
-}
-
-.header .header-content {
-padding-bottom: 0px;
-padding: 7px 0 0 0px;
-}
-
-.header #branding {
-border-right:none;
-}
-
 .left-nav>ul>li.active>a:after {
 content: none;
 
 }
 
-.nav-quick-search{
-margin: 0px 0 0px 0px;
-padding:0 20px 0 0;
-float:right;
-}
-
-.header #branding {
-width: 100%;
-}
-
 /**
 * login page
 */
@@ -220,12 +463,16 @@ background-color: #ffffff;
 }*/
 
 .login #content-main {
-width: 280px;
-height: 365px;
-border-radius: 0px;
+width: 280px !important;
+min-width: 180px;
+height: 265px;
+  -webkit-border-radius: 5;
+  -moz-border-radius: 5;
+  border-radius: 5px;
 /*background: #EBF0F2;*/
 background: rgba(255,255,255,0.85);
 /*background: rgba(235,240,242,0.6);*/
+overflow: visible !important;
 }
 
 .login #content-main h1 {
@@ -305,10 +552,13 @@ padding-left: 45px;
 /*Dec 11 2013*/
 
 .nav-tabs-suit li.active a{
-text-shadow: none;
+letter-spacing: 1px;
+text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
+/*text-shadow: none;
 -webkit-box-shadow: none;
 -moz-box-shadow: none;
 box-shadow: none;
+*/
 }
 
 .nav-tabs>.active>a{
@@ -317,6 +567,9 @@ border: none;
 
 .nav-tabs-suit li a:hover{
 border: none;
+color: #ffffff;
+letter-spacing: 1px;
+text-shadow: rgb(46, 43, 43) 0.1em 0.1em 0.2em;
 }
 
 .nav-tabs-suit li.active a:hover{
@@ -349,18 +602,30 @@ background-repeat: no-repeat;
     width: 265px;
 }
 
+/** Leave room for scroll bar now that contents can be appropriately scrolled **/
+.form-horizontal .inline-group .add-row {
+    margin: -1px -1px 15px 0px;
+}
 
-.header{
-background-color: #000000;
-background-image: url('bg2.jpg');
-background-size: 100% auto;
+/** Setting overflow and 1kpx to deal with inlines/forms overlapping on 
+    browser resizes **/
+#content-main {
+    overflow-x:auto;
+    min-width: 1000px;
 }
 
+.tab-content tab-content-main {
+    overflow-x: auto !important;
+}
 
 #wrap{
 background:none;
 }
 
+.noclearfix {
+    display:block; clear:left; width:0px; height:0px;
+}
+
 body{
 background-color:#ffffff;
 }
@@ -368,14 +633,6 @@ background-color:#ffffff;
 .suit-column{
 background-color:#ffffff;
 }
-.nav-quick-search .search-query{
-border-radius:0px;
-border:none;
-box-shadow:0px;
-background-color:#282828;
-padding-left: 27px;
-}
-
 /*Added on 13th*/
 
 /*.input-icon {
@@ -402,9 +659,6 @@ height: 84.5%;
 #wrap {
     background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
 }
-#wrap {
-    background: url("../img/bg_left_white.gif") repeat-y scroll left top rgba(0, 0, 0, 0);
-}
 #wrap {
     height: auto !important;
     margin: 0 auto -60px;
@@ -429,7 +683,8 @@ height: 84.5%;
 }
 
 .nav-tabs > .active > a, .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus {
-       background-color: #448CCA;
+       /*background-color: #448CCA;*/
+       background-color: #105E9E;
        color: #FFF;
        border: none;
 }
@@ -443,27 +698,31 @@ height: 84.5%;
 }
 
 .nodetextbox{
-       background-color: #ededed;
+       /*background-color: #ededed;*/
        line-height: 25px;
        width: 150px; 
        text-align: center;
        font-weight: bold;
-       margin-left:5px;
+       margin-left:0px;
        display:inline-block;
        border:none;
        font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
-       font-size: 13px;
+       font-size: 8px;
 }
 
 .nodelabel{
-width: 40px;
+width: 20px;
 display: inline-block;
 border-radius: 0px;
 border:1px solid #000;
-line-height: 23px;
+/*line-height: 23px;*/
 text-align: center;
+font-weight: normal;
 }
 
+#user-tools {
+  font-weight: bold;
+}
 .header-content .header-column {
        display: none;
 }
@@ -498,22 +757,23 @@ height:22px;
 background-image: url("opencloudApp.png");
 }
 .icon-home {
-background-image: url("Home.png");
+/*  Going with darker standard color nav -- so using over png's background-image: url("Home.png"); */
+background-image: url("Home_over.png");
 }
 .icon-deployment{
-background-image: url("Deployments.png");
+background-image: url("Deployments_over.png");
 }
 .icon-site{
-background-image: url("Sites.png");
+background-image: url("Sites_over.png");
 }
 .icon-slice{
-background-image: url("Slices.png");
+background-image: url("Slices_over.png");
 }
 .icon-user{
-background-image: url("Users.png");
+background-image: url("Users_over.png");
 }
 .icon-reservation{
-background-image: url("Reservations.png");
+background-image: url("Reservations_over.png");
 }
 
 .left-nav>ul>li.active>a>.icon-home , .left-nav>ul>li:hover>a>.icon-home , .left-nav>ul>li.focus>a>.icon-home{
@@ -535,3 +795,355 @@ background-image: url("Users_over.png");
 .left-nav>ul>li.active>a>.icon-reservation , .left-nav>ul>li:hover>a>.icon-reservation , .left-nav>ul>li.focus>a>.icon-reservation{
 background-image: url("Reservations_over.png");
 }
+
+#dashboardHPC {
+    padding-bottom: 10px;
+}
+.summary-attr {
+    padding-right: 20px;
+}
+.summary-attr-util {
+    padding-right: 20px;
+    color: green;
+}
+.SiteDetail {
+color: darkBlue;
+    font-size: 1.5em;
+}
+#addSlivers {
+ color: green;
+text-decoration: underline;
+    padding-right: 20px;
+}
+#remSlivers {
+ color: red;
+ text-decoration: underline;
+}
+#map-us {
+    padding-top: 10px;
+    width: 700px;
+    height: 400px;
+}
+
+.minidashbutton {
+       -moz-box-shadow:inset 0px 1px 0px 0px #ffffff;
+       -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff;
+       box-shadow:inset 0px 1px 0px 0px #ffffff;
+       background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffffff), color-stop(1, #f6f6f6));
+       background:-moz-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+       background:-webkit-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+       background:-o-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+       background:-ms-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+       background:linear-gradient(to bottom, #ffffff 5%, #f6f6f6 100%);
+       filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f6f6f6',GradientType=0);
+       background-color:#ffffff;
+       -moz-border-radius:6px;
+       -webkit-border-radius:6px;
+       border-radius:6px;
+       border:1px solid #dcdcdc;
+       display:inline-block;
+       cursor:pointer;
+       color:#666666;
+       font-family:arial;
+       font-size:15px;
+       font-weight:bold;
+       padding:6px 24px;
+       text-decoration:none;
+       text-shadow:0px 1px 0px #ffffff;
+}
+.minidashbutton:hover {
+       background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #f6f6f6), color-stop(1, #ffffff));
+       background:-moz-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+       background:-webkit-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+       background:-o-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+       background:-ms-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+       background:linear-gradient(to bottom, #f6f6f6 5%, #ffffff 100%);
+       filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#ffffff',GradientType=0);
+       background-color:#f6f6f6;
+}
+
+.newMiniDashboard {
+    border: 1px solid green;
+    width: auto;
+}
+
+.endDashPair {
+    clear: left;
+}
+.miniDashPair {
+    float: left;
+    width: auto;
+    margin-left: 20px;
+}
+
+.miniDashPair label {
+ text-align: center;
+}
+/* Charts CSS */
+p.numeral
+{
+       font-size:32pt;
+       color:#ffffff;
+       opacity: 0.7;
+       font-family:Helvetica Neue;
+       font-weight:100;
+       text-align:center;
+       line-height:75%;
+}
+
+.helper-text
+{
+       border: 1px solid #fff;
+       padding: 7px;
+       border-radius: 18px;
+       font-size:13pt;
+       color:#ffffff;
+       opacity: 0.7;
+       font-family:Helvetica Neue;
+       font-weight:200;
+       text-align:center;
+       line-height:100%;
+}
+p.osobject
+{
+       font-size:12pt;
+       color:#ffffff;
+       opacity: 0.7;
+       font-family:Helvetica Neue;
+       font-weight:200;
+       text-align:center;
+       line-height:100%;
+}
+
+p.heading
+{
+       font-size:20px;
+        letter-spacing: 1px;
+       color: black;
+       font-family:Arial;
+       font-weight:bold;
+       text-align:center;
+}
+
+/*p.heading
+{
+       font-size:32pt;
+       color:#ffffff;
+       opacity: 0.7;
+       font-family:Helvetica Neue;
+       font-weight:200;
+       text-align:center;
+}*/
+
+div.graph 
+{
+       height:340px;
+}
+
+div.numeral 
+{
+       height:120px;
+}
+
+div.heading 
+{
+       height:10px;
+}
+
+div.padding 
+{
+       height:20px;
+}
+
+div.chartContainer
+{
+       /*background-image:url('chartsBg.jpg');*/
+       width:527px;
+       height:400px;
+       border:1px;
+}
+
+/* D3 */
+
+.axis path,
+.axis line {
+  fill: none;
+  stroke: #ffffff;
+  opacity: 0.7;
+  shape-rendering: crispEdges;
+}
+
+
+.x.axis path {
+  display: none;
+}
+
+.x.axis text {
+  fill: white;
+  opacity: 0.5;
+}
+
+.y.axis text {
+  opacity: 0.5;
+  fill: white;
+}
+
+.y.axis text.legend {
+  opacity: 1.0;
+  fill: white;
+  font-size:8pt;
+}
+
+.line {
+  fill: none;
+  stroke: white;
+  stroke-width: 3px;
+  opacity: 0.6;
+}
+
+
+/******  Added in so that we can have a loader show as charts get ready to render ***/
+.loading {
+    //background-color: orange;
+    background-image: url(spinner.gif) no-repeat center middle;
+    text-align: center;
+    font-size: 20px;
+    height: 100%
+/*    width: auto;*/
+    float: left;
+    padding: 10px;
+}
+/* Charts CSS */
+
+#tabs-4 {
+    margin: 40px;
+    font-size: 24px;
+    font-weight: bold;
+}
+
+.tenant-row{
+   padding-bottom: 0.7%;
+}
+
+/***********TENANT VIEW*************/
+
+#image-dropdown,#slice-image-value,#adv-slice-image-value{
+ margin-left: 5%;
+}
+
+#network-dropdown,#adv-network-dropdown,#adv-network-value{
+ margin-left: 3.7%;
+}
+
+#service-level-dropdown,#service-level-value,#adv-service-level-dropdown,#adv-service-level-value{
+ margin-left: 0.2% !important;
+}
+
+#slice-name-value,#adv-slice-name-value{
+   margin-left: 2%;
+}
+#adv-dataset-dropdown{
+margin-left: 3%;
+}
+#advanced-tenant,#basic-tenant,#sliver-btn,#save-btn{
+  float:right;
+}
+ #delete-slice-btn,#download-details{
+       margin-left:1%;
+}
+
+#sliver-btn,#save-btn,#create-slice-btn,#delete-slice-btn,#download-details{
+  margin-top:1%;
+}
+
+.tenantDialog.ui-widget input{
+        border-radius: 0px !important;
+       height: 12px !important;
+       width: 180px !important;
+       margin-right: 10% !important;
+       float: right;
+}
+
+.tenantDialog .ui-dialog-buttonset .ui-button{
+border-radius: 0 !important;
+background-color: grey !important;
+font-weight: bold !important;
+font-size: 0.9em; !important
+}
+
+.tenantDialog .ui-dialog-titlebar{
+border-radius: 0 !important;
+background-color: grey !important;
+}
+
+.create-slice-row{
+       margin-bottom: 4%;
+       clear: both;
+       height: 25px;
+}
+
+.create-slice-row label, .tenantDialog label{
+   margin-right:1%;
+   float:left;
+}
+
+.create-slice-row select{
+   height:24px;
+   width: 196px;
+   font-size: 0.9em !important;
+}
+
+.tenant-create-slice{
+       float:right;
+       margin-right: 10% !important;
+}
+
+#delete-slice{
+float: right;
+}
+
+#tooltip,#adv-tooltip,#basic-tooltip{
+font-size:0.7em;
+color:red;
+display:none;
+}
+
+#tenantSliceDataWrapper {
+       padding: 1% 0;
+}
+
+#advancedTenantSliceDataWrapper .help-inline{
+       font-size: 11px;
+       color: #999;
+       padding-bottom: 1%;
+}
+
+.create-slice-row label{
+       clear:both;
+       margin-right: 1%;
+}
+
+#advNumOfSlivers{
+        margin-right: 1% !important;
+}
+
+#private-vol-checkbox{
+margin: 0 0 1% 1%;
+}
+
+.public-key-warning{
+text-align: center;
+display:none;
+}
+
+#private-vol{
+margin-right: 15% !important;
+}\r
+\r
+.customize_row {\r
+  display: table;\r
+}\r
+.customize_column {\r
+  display: table-cell;\r
+  padding: 10px;\r
+}\r
diff --git a/planetstack/core/static/planetstack_graphs.js b/planetstack/core/static/planetstack_graphs.js
new file mode 100644 (file)
index 0000000..d8690ed
--- /dev/null
@@ -0,0 +1,120 @@
+google.load('visualization', '1', {'packages' : ['controls','table','corechart','geochart']});
+
+function renderChart(newStyle, dialog, container, dataSourceUrl, yColumn, xColumn, aggFunc, options) {
+    if ( newStyle ) {
+        $(dialog).dialog("open");
+    }
+    else {
+        $(container).empty();
+        $(dialog).modal('show');
+        $('.modal-body').scrollTop(0);
+    }
+
+    startQuery(container, dataSourceUrl, yColumn, xColumn, aggFunc, options)
+}
+
+function startQuery(container, dataSourceUrl, yColumn, xColumn, aggFunc, options) {
+    var query = new google.visualization.Query(dataSourceUrl);
+    query && query.abort();
+    query.send(function(response) {handleResponse_psg(container, dataSourceUrl, response, yColumn, xColumn, aggFunc, options);});
+}
+
+// NOTE: appended _psg to showLine() and handleResponse() to prevent conflict
+//       with Sapan's analytics page.
+
+function agg_bandwidth(arr) {
+        var ret = 0;
+        for (var i = 0; i < arr.length; i++) {
+                ret+=arr[i]*8.0/1024.0/1024.0/1024.0;
+        }
+        return ret;
+}
+
+function showLine_psg(container, dt, options) {
+    var base_options = {
+            'width': 520,
+            'height': 300,
+           'pages': true,
+           'numRows': 9,
+            'backgroundColor': 'transparent',
+            'titleTextStyle': {"color": "black"},
+            'legend': 'none',
+            'hAxis': {"baselineColor": "darkBlue",
+                      "textStyle": {"color": "black"}},
+            'vAxis': {"baselineColor": "darkBlue",
+                      "textStyle": {"color": "black"}},
+          }
+
+    options = $.extend(true, {}, base_options, options);
+
+    var lineChart = new google.visualization.ChartWrapper({
+          'chartType': 'LineChart',
+          'containerId': container.substring(1),
+          'view': {'columns': [0, 1]},
+          'options': options
+        });
+        lineChart.setDataTable(dt);
+        lineChart.draw();
+
+}
+
+function fixDate(unixDate) {
+    return new Date(unixDate*1000);
+}
+
+function fixDate2(unixDate) {
+    return new Date(unixDate);
+}
+
+function handleResponse_psg(container, dataSourceUrl, response, yColumn, xColumn, aggFunc, options) {
+    var supportedClasses = {
+                    'Table':google.visualization.Table,
+                    'LineChart':google.visualization.LineChart,
+                    'ScatterChart':google.visualization.ScatterChart,
+                    'ColumnChart':google.visualization.ColumnChart,
+                    'GeoChart':google.visualization.GeoChart,
+                    'PieChart':google.visualization.PieChart,
+                    'Histogram':google.visualization.Histogram};
+
+    if (response.isError()) {
+        //console.log("retry chart");
+        setTimeout(function () { startQuery(container, dataSourceUrl, yColumn, xColumn, aggFunc, options) }, 5000);
+        return
+    }
+
+    var proxy = new google.visualization.ChartWrapper({
+      'chartType': 'Table',
+      'containerId': 'graph_work',
+      'options': {
+        'width': 800,
+        'height': 300,
+         pageSize:5,
+         page:'enable',
+        'legend': 'none',
+        'title': 'Nodes'
+      },
+      'view': {'columns': [0,1]}
+    });
+
+    google.visualization.events.addListener(proxy, 'ready', function () {
+        var dt = proxy.getDataTable();
+        var groupedData1 = google.visualization.data.group(dt, [{
+           column: yColumn,
+           type: 'datetime',
+           modifier: fixDate2,
+           }],
+           [{
+            column: xColumn,
+            type: 'number',
+            label: dt.getColumnLabel(xColumn),
+            aggregation: aggFunc}]);
+
+        showLine_psg(container, groupedData1, options);
+    });
+
+    proxy.setDataTable(response.getDataTable());
+
+    proxy.draw();
+}
+
+
diff --git a/planetstack/core/static/planetstack_graphs_old.js b/planetstack/core/static/planetstack_graphs_old.js
new file mode 100644 (file)
index 0000000..806afe6
--- /dev/null
@@ -0,0 +1,89 @@
+$(document).ready(function() {
+
+function renderChart(jsonData, yField, xField, legend) {
+    $('#graph').empty();
+    $('#chartsModal').modal('show');
+    $('.modal-body').scrollTop(0)
+    var margin = {top: 0, right: 100, bottom: 100, left: 175},
+    width = 520 - margin.left - margin.right,
+    height = 300 - margin.top - margin.bottom;
+
+    var parseDate = d3.time.format("%Y-%m-%m-%H-%M").parse;
+
+    var x = d3.time.scale()
+    .range([0, width]);
+
+    var y = d3.scale.linear()
+    .range([height, 0]);
+
+    var xAxis = d3.svg.axis()
+    .scale(x)
+    .ticks(d3.time.minutes, 15)
+    .orient("bottom");
+
+    var yAxis = d3.svg.axis()
+    .scale(y)
+    .ticks(4)
+    .orient("left");
+
+    var line = d3.svg.line()
+    .x(function(d) { return x(d.date); })
+    .y(function(d) { return y(d.value); });
+
+    var svg = d3.select("#graph").append("svg")
+    .attr("width", width + margin.left + margin.right)
+    .attr("height", height + margin.top + margin.bottom)
+    .append("g")
+    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+    data = jsonData.rows;
+    $('#chartHeading').text(legend);
+    data.forEach(function(d) {
+            d.date = new Date(d[yField]*1000);
+            d.value = +d[xField];
+            });
+
+    x.domain(d3.extent(data, function(d) { return d.date; }));
+
+    var e = d3.extent(data, function(d) { return d.value;});
+    e = [e[0]-1,e[1]+1];
+
+    y.domain(e);
+
+    svg.append("g")
+    .attr("class", "x axis")
+    .attr("transform", "translate(0," + height + ")")
+    .attr("x", 5)
+    .call(xAxis);
+
+    svg.append("g")
+    .attr("class", "y axis")
+    .call(yAxis)
+    .append("text")
+    .attr("transform", "rotate(-90)")
+    .attr("y", 6)
+    .attr("dy", ".71em")
+    .style("text-anchor", "end")
+    .text(legend)
+    .attr("class", "legend");
+
+    svg.append("path")
+    .datum(data)
+    .attr("class", "line")
+    .attr("d", line);
+}
+
+$('.nodesLabel, .nodesValue').click(function() {
+        var jsonData = window.pageAnalyticsData;
+        renderChart(jsonData, "MinuteTime", "count_hostname", "Node Count");
+});
+$('.cpuLabel, .cpuValue').click(function() {
+        var jsonData = window.pageAnalyticsData;
+        renderChart(jsonData, "MinuteTime", "avg_cpu", "Average Cpu");
+});
+$('.bandwidthLabel, .bandwidthValue').click(function() {
+        var jsonData = window.pageBandData;
+        renderChart(jsonData, "MinuteTime", "sum_computed_bytes_sent_div_elapsed", "Bandwidth");
+});
+
+})
diff --git a/planetstack/deployment_auth.py b/planetstack/deployment_auth.py
new file mode 100644 (file)
index 0000000..f7383ea
--- /dev/null
@@ -0,0 +1,25 @@
+## 
+# This file contains the auth credentials used to access openstack deployments 
+# we wish to manage. The 'default' credentials will be used for any deployments
+# not specifed here.
+#
+
+deployment_auth = {
+# Example
+#   'deployment_name': {
+#       'user': 'email@domain.com',
+#       'pasword': 'password',
+#       'tenant': 'tenant',    
+#       'url': 'http://localhost:5000/v2.0/',
+#       'token': 'ADMIN',
+#       'endpoint': 'http://localhost:35357/v2.0/'    
+#    }, 
+    
+    'default': {
+        'user': 'admin@domain.com',
+        'password': 'admin',
+        'tenant': 'admin', 
+        'url': 'http://localhost:5000/v2.0/'     
+    },
+
+}
old mode 100755 (executable)
new mode 100644 (file)
index 0075f59..f38650d
@@ -10,39 +10,63 @@ sys.path.append('.')
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 
 from django.db.models.fields.related import ForeignKey
-from core.models import *
 
-try:
-       output = sys.args[1]
-except:
-       output = '-json'
+# defaults
+app = "core"
+output = "-json"
+
+# syntax: dmdot [-json | -dot] [app_name]
+
+# poor man's argument parser
+for arg in sys.argv[1:]:
+    if arg.startswith("-"):
+        output = arg
+    else:
+        app = arg
+
+app = app + ".models"
+#models_module = imp.load_source(app, ".")
+models_module = __import__(app)
+for part in app.split(".")[1:]:
+    if hasattr(models_module, "PlCoreBase"):
+        break
+    models_module = getattr(models_module,part)
+
+PlCoreBase = getattr(models_module,"PlCoreBase")
 
-g = globals()
 model_classes = []
 class_names = []
-
-for c in g.values():
+lower_class_names = {}
+for classname in dir(models_module):
+        c = getattr(models_module, classname, None)
        if type(c)==type(PlCoreBase):
                model_classes.append(c)
                class_names.append(c.__name__)
+                lower_class_names[c.__name__.lower()] = c
 
+# django doesn't use the correct case in field.name.title() for objects that
+# have CamelCased class names. So, compare everything in lower case.
 
 if (output=='-dot'):
        print "digraph plstack {";
        for c in model_classes:
                fields = c._meta.fields
                for f in fields:
-                       if type(f)==ForeignKey and f.name.title() in class_names:
-                               print '\t"%s"->"%s";'%(c.__name__,f.name.title())
+                       if type(f)==ForeignKey and f.name.lower() in lower_class_names:
+                                linked_class = lower_class_names[f.name.lower()]
+                               print '\t"%s"->"%s";'%(c.__name__,linked_class.__name__)
        print "}\n";
 elif (output=='-json'):
        d = {}
        for c in model_classes:
                fields = c._meta.fields
                for f in fields:
-                       if type(f)==ForeignKey and f.name.title() in class_names:
+                       if type(f)==ForeignKey and f.name.lower() in lower_class_names:
+                                linked_class = lower_class_names[f.name.lower()]
                                try:
-                                       d[c.__name__].append(f.name.title())
+                                       d[c.__name__].append(linked_class.__name__)
                                except KeyError:
-                                       d[c.__name__]=[f.name.title()]
+                                       d[c.__name__]=[linked_class.__name__]
        print json.dumps(d,indent=4)
+       
+       
index efd9eb3..2a6d518 100644 (file)
@@ -10,43 +10,83 @@ from django.contrib.auth.signals import user_logged_in
 from django.utils import timezone
 from django.contrib.contenttypes import generic
 from suit.widgets import LinkedSelect
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline, SliceROInline,ServiceAttrAsTabROInline, ReadOnlyAwareAdmin, PlStackTabularInline, ReadOnlyTabularInline
 
-#class HPCRRBaseAdmin(admin.ModelAdmin):
-    #exclude = ['enacted']
+class HpcServiceAdmin(SingletonAdmin):
+    model = HpcService
+    verbose_name = "HPC Service"
+    verbose_name_plural = "HPC Service"
+    list_display = ("name","enabled")
+    fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description'], 'classes':['suit-tab suit-tab-general']})]
+    inlines = [SliceInline,ServiceAttrAsTabInline]
 
-class CDNPrefixInline(admin.TabularInline):
+    user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
+    user_readonly_inlines = [SliceROInline, ServiceAttrAsTabROInline]
+
+    suit_form_tabs =(('general', 'HPC Service Details'),
+        ('slices','Slices'),
+        ('serviceattrs','Additional Attributes'),
+    )
+
+class CDNPrefixInline(PlStackTabularInline):
+    model = CDNPrefix
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-prefixes'
+    fields = ('cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
+    readonly_fields = ('cdn_prefix_id',)
+
+class CDNPrefixROInline(ReadOnlyTabularInline):
     model = CDNPrefix
     extra = 0
     suit_classes = 'suit-tab suit-tab-prefixes'
+    fields = ('cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
+    readonly_fields = ('cdn_prefix_id',)
 
-class ContentProviderInline(admin.TabularInline):
+class ContentProviderInline(PlStackTabularInline):
     model = ContentProvider
     extra = 0
     suit_classes = 'suit-tab suit-tab-cps'
+    fields = ('content_provider_id', 'name', 'enabled')
+    readonly_fields = ('content_provider_id',)
 
-class OriginServerAdmin(admin.ModelAdmin):
+class ContentProviderROInline(ReadOnlyTabularInline):
+    model = ContentProvider
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-cps'
+
+class OriginServerAdmin(ReadOnlyAwareAdmin):
     list_display = ('url','protocol','redirects','contentProvider','authenticated','enabled' )
 
+    fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description' )
+    readonly_fields = ('origin_server_id',)
+    user_readonly_fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description')
+
 class ContentProviderForm(forms.ModelForm):
     class Meta:
         widgets = {
             'serviceProvider' : LinkedSelect
         }
 
-class ContentProviderAdmin(admin.ModelAdmin):
+class ContentProviderAdmin(ReadOnlyAwareAdmin):
     form = ContentProviderForm
     list_display = ('name','description','enabled' )
     fieldsets = [ (None, {'fields': ['name','enabled','description','serviceProvider','users'], 'classes':['suit-tab suit-tab-general']})]
 
     inlines = [CDNPrefixInline]
 
+    user_readonly_fields = ('name','description','enabled','serviceProvider','users')
+    user_readonly_inlines = [CDNPrefixROInline]
+
     suit_form_tabs = (('general','Details'),('prefixes','CDN Prefixes'))
 
-class ServiceProviderAdmin(admin.ModelAdmin):
+class ServiceProviderAdmin(ReadOnlyAwareAdmin):
     list_display = ('name', 'description', 'enabled')
     fieldsets = [
         (None, {'fields': ['name','description','enabled'], 'classes':['suit-tab suit-tab-general']})]
-#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})] 
+#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})]
+
+    user_readonly_fields = ('name', 'description', 'enabled')
+    user_readonly_inlines = [ContentProviderROInline]
 
     suit_form_tabs = (('general','Details'),('cps','Content Providers'))
     inlines = [ContentProviderInline]
@@ -57,13 +97,31 @@ class CDNPrefixForm(forms.ModelForm):
             'contentProvider' : LinkedSelect
         }
 
-class CDNPrefixAdmin(admin.ModelAdmin):
+class CDNPrefixAdmin(ReadOnlyAwareAdmin):
     form = CDNPrefixForm
     list_display = ['prefix','contentProvider']
+    fields = ['prefix', 'contentProvider', 'cdn_prefix_id', 'description', 'defaultOriginServer', 'enabled']
+    user_readonly_fields = ['prefix','contentProvider', "cdn_prefix_id", "description", "defaultOriginServer", "enabled"]
+
+class SiteMapAdmin(ReadOnlyAwareAdmin):
+    model = SiteMap
+    verbose_name = "Site Map"
+    verbose_name_plural = "Site Map"
+    list_display = ("name", "contentProvider", "serviceProvider")
+    user_readonly_fields = ("name", "contentProvider", "serviceProvider", "description", "map")
+
+class AccessMapAdmin(ReadOnlyAwareAdmin):
+    model = AccessMap
+    verbose_name = "Access Map"
+    verbose_name_plural = "Access Map"
+    list_display = ("name", "contentProvider")
+    user_readonly_fields = ("name", "contentProvider", "description", "map")
 
 admin.site.register(ServiceProvider, ServiceProviderAdmin)
 admin.site.register(ContentProvider, ContentProviderAdmin)
 admin.site.register(CDNPrefix, CDNPrefixAdmin)
 admin.site.register(OriginServer,OriginServerAdmin)
-admin.site.register(HpcService)
+admin.site.register(HpcService, HpcServiceAdmin)
+admin.site.register(SiteMap, SiteMapAdmin)
+admin.site.register(AccessMap, AccessMapAdmin)
 
index 9f5f165..2980ce7 100644 (file)
@@ -28,6 +28,10 @@ class ContentProvider(PlCoreBase):
     class Meta:
         app_label = "hpc"
 
+    # legacy vicci content providers already have names.
+    CP_TO_ACCOUNT = {"ON.LAB": "onlabcp",
+                     "Syndicate": "syndicatecp"}
+
     content_provider_id = models.IntegerField(null=True, blank=True)
     name = models.CharField(max_length=254)
     enabled = models.BooleanField(default=True)
@@ -39,6 +43,10 @@ class ContentProvider(PlCoreBase):
 
     def __unicode__(self):  return u'%s' % (self.name)
 
+    @property
+    def account(self):
+        return self.CP_TO_ACCOUNT.get(self.name, self.name)
+
 class OriginServer(PlCoreBase):
     class Meta:
         app_label = "hpc"
@@ -70,3 +78,20 @@ class CDNPrefix(PlCoreBase):
 
     def __unicode__(self):  return u'%s' % (self.prefix)
 
+class AccessMap(models.Model):
+    contentProvider = models.ForeignKey(ContentProvider)
+    name = models.CharField(max_length=64, help_text="Name of the Access Map")
+    description = models.TextField(null=True, blank=True,max_length=130)
+    map = models.FileField(upload_to="maps/", help_text="specifies which client requests are allowed")
+
+    def __unicode__(self):  return self.name
+
+class SiteMap(models.Model):
+    """ can be bound to a ContentProvider, ServiceProvider, or neither """
+    contentProvider = models.ForeignKey(ContentProvider, blank=True, null=True)
+    serviceProvider = models.ForeignKey(ServiceProvider, blank=True, null=True)
+    name = models.CharField(max_length=64, help_text="Name of the Site Map")
+    description = models.TextField(null=True, blank=True,max_length=130)
+    map = models.FileField(upload_to="maps/", help_text="specifies how to map requests to hpc instances")
+
+    def __unicode__(self):  return self.name
diff --git a/planetstack/hpc_wizard/README b/planetstack/hpc_wizard/README
new file mode 100644 (file)
index 0000000..06b12b5
--- /dev/null
@@ -0,0 +1,10 @@
+Two files are purposely not included in the git repository:
+    bigquery_credentials.dat
+    client_secrets.json
+
+These files must be manually installed.
+
+Additionally, the following packages must be installed:
+    yum -y install python-httplib2
+    easy_install python_gflags
+    easy_install google_api_python_client
diff --git a/planetstack/hpc_wizard/bigquery_analytics.py b/planetstack/hpc_wizard/bigquery_analytics.py
new file mode 100644 (file)
index 0000000..4a90c2b
--- /dev/null
@@ -0,0 +1,288 @@
+import re
+import base64
+import requests
+import urllib
+import json
+import httplib2
+import threading
+import os
+import sys
+import time
+import traceback
+
+from apiclient.discovery import build
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.file import Storage
+from oauth2client.tools import run_flow,run
+
+"""
+yum -y install python-httplib2
+easy_install python_gflags
+easy_install google_api_python_client
+"""
+
+PROJECT_NUMBER = '549187599759'
+
+try:
+    FLOW = flow_from_clientsecrets('/opt/planetstack/hpc_wizard/client_secrets.json',
+                                   scope='https://www.googleapis.com/auth/bigquery')
+    BIGQUERY_AVAILABLE = True
+except:
+    print >> sys.stderr, "exception while initializing bigquery flow"
+    traceback.print_exc()
+    FLOW = None
+    BIGQUERY_AVAILABLE = False
+
+MINUTE_MS = 60*1000
+HOUR_MS = 60*60*1000
+
+# global to hold cached mappings
+mappings = {}
+reverse_mappings = {}
+
+def to_number(s):
+   try:
+       if "." in str(s):
+           return float(s)
+       else:
+           return int(s)
+   except:
+       return 0
+
+class MappingException(Exception):
+    pass
+
+class BigQueryAnalytics:
+    def __init__(self, table = "demoevents"):
+        self.projectName = "vicci"
+        self.tableName = table
+
+    def reload_mapping(self):
+        global mappings, reverse_mappings
+        mappings[self.tableName] = json.loads(self.fetch_mapping(table=self.tableName))
+        reverse_mappings[self.tableName] = {v:k for k, v in mappings[self.tableName].items()}
+
+    def fetch_mapping(self, m=0, table="events"):
+       req = 'http://cloud-scrutiny.appspot.com/command?action=get_allocations&multiplexer=%d&table=%s'% (m,table)
+       resp = requests.get(req)
+       if (resp.status_code==200):
+               return resp.text
+       else:
+               raise Exception('Error accessing register allocations: %d'%resp.status_code)
+
+    def run_query_raw(self, query):
+        try:
+            file("/tmp/query_log","a").write("query %s\n" % query)
+        except:
+            pass
+
+        p = re.compile('%[a-zA-z_]*')
+
+        try:
+            query = p.sub(self.remap, query)
+        except MappingException:
+            self.reload_mapping()
+            query = p.sub(self.remap, query)
+
+        try:
+            file("/tmp/query_log","a").write("remapped query %s\n" % query)
+        except:
+            pass
+
+       storage = Storage('/opt/planetstack/hpc_wizard/bigquery_credentials.dat')
+       credentials = storage.get()
+
+       if credentials is None or credentials.invalid:
+            credentials = run(FLOW, storage)
+
+       http = httplib2.Http()
+       http = credentials.authorize(http)
+
+       service = build('bigquery', 'v2', http=http)
+
+        body = {"query": query,
+                "timeoutMs": 60000}
+        response = service.jobs().query(projectId=PROJECT_NUMBER, body=body).execute()
+
+        return response
+
+    def translate_schema(self, response):
+        for field in response["schema"]["fields"]:
+            field["name"] = reverse_mappings[self.tableName].get(field["name"], field["name"])
+
+    def run_query(self, query):
+        if not BIGQUERY_AVAILABLE:
+            print >> sys.stderr, "bigquery_analytics: bigquery flow is not available. returning empty result."
+            return []
+
+        response = self.run_query_raw(query)
+
+        fieldNames = []
+        for field in response["schema"]["fields"]:
+            fieldNames.append(field["name"])
+
+        result = []
+        if "rows" in response:
+            for row in response["rows"]:
+                this_result = {}
+                for (i,column) in enumerate(row["f"]):
+                    this_result[reverse_mappings[self.tableName].get(fieldNames[i],fieldNames[i])] = column["v"]
+                result.append(this_result)
+
+        return result
+
+    """ Filter_results, groupby_results, do_computed_fields, and postprocess_results
+        are all used for postprocessing queries. The idea is to do one query that
+        includes the ungrouped and unfiltered data, and cache it for multiple
+        consumers who will filter and group it as necessary.
+
+        TODO: Find a more generalized source for these sorts operations. Perhaps
+        put the results in SQLite and then run SQL queries against it.
+    """
+
+    def filter_results(self, rows, name, value):
+        result = [row for row in rows if row.get(name)==value]
+        return result
+
+    def groupby_results(self, rows, groupBy=[], sum=[], count=[], avg=[], maxi=[]):
+        new_rows = {}
+        for row in rows:
+            groupby_key = [row.get(k, None) for k in groupBy]
+
+            if str(groupby_key) not in new_rows:
+                new_row = {}
+                for k in groupBy:
+                    new_row[k] = row.get(k, None)
+
+                new_rows[str(groupby_key)] = new_row
+            else:
+                new_row = new_rows[str(groupby_key)]
+
+            for k in sum:
+                new_row["sum_" + k] = new_row.get("sum_" + k, 0) + to_number(row.get(k,0))
+
+            for k in avg:
+                new_row["avg_" + k] = new_row.get("avg_" + k, 0) + to_number(row.get(k,0))
+                new_row["avg_base_" + k] = new_row.get("avg_base_"+k,0) + 1
+
+            for k in maxi:
+                new_row["max_" + k] = max(new_row.get("max_" + k, 0), to_number(row.get(k,0)))
+
+            for k in count:
+                v = row.get(k,None)
+                dl = new_row["distinct_" + k] = new_row.get("distinct_" + k, [])
+                if (v not in dl):
+                    dl.append(v)
+
+                #new_row["count_" + k] = new_row.get("count_" + k, 0) + 1
+
+        for row in new_rows.values():
+            for k in avg:
+                row["avg_" + k] = float(row["avg_" + k]) / row["avg_base_" + k]
+                del row["avg_base_" + k]
+
+            for k in count:
+                new_row["count_" + k] = len(new_row.get("distinct_" + k, []))
+
+        return new_rows.values()
+
+    def do_computed_fields(self, rows, computed=[]):
+        computedFieldNames=[]
+        for row in rows:
+            for k in computed:
+                if "/" in k:
+                    parts = k.split("/")
+                    computedFieldName = "computed_" + parts[0].replace("%","")+"_div_"+parts[1].replace("%","")
+                    try:
+                        row[computedFieldName] = to_number(row[parts[0]]) / to_number(row[parts[1]])
+                    except:
+                        pass
+
+                    if computedFieldName not in computedFieldNames:
+                        computedFieldNames.append(computedFieldName)
+        return (computedFieldNames, rows)
+
+    def postprocess_results(self, rows, filter={}, groupBy=[], sum=[], count=[], avg=[], computed=[], maxi=[], maxDeltaTime=None):
+        sum = [x.replace("%","") for x in sum]
+        count = [x.replace("%","") for x in count]
+        avg = [x.replace("%","") for x in avg]
+        computed = [x.replace("%","") for x in computed]
+        maxi = [x.replace("%","") for x in maxi]
+        groupBy = [x.replace("%","") for x in groupBy]
+
+        for (k,v) in filter.items():
+            rows = self.filter_results(rows, k, v)
+
+        if rows:
+            if maxDeltaTime is not None:
+                maxTime = max([float(row["time"]) for row in rows])
+                rows = [row for row in rows if float(row["time"])>=maxTime-maxDeltaTime]
+
+        (computedFieldNames, rows) = self.do_computed_fields(rows, computed)
+        sum = sum + computedFieldNames
+        if groupBy:
+            rows = self.groupby_results(rows, groupBy, sum, count, avg, maxi)
+        return rows
+
+    def remap(self, match):
+        if not self.tableName in mappings:
+            raise MappingException("no mapping for table %s" % self.tableName)
+
+        mapping = mappings[self.tableName]
+
+        token = match.group()[1:]
+        if token in mapping:
+            return mapping[token]
+        else:
+            raise MappingException('unknown token %s' % token)
+
+    def dump_table(self, rows, keys=None):
+        if not keys:
+            keys = rows[0].keys()
+
+        lens = {}
+        for key in keys:
+            lens[key] = len(key)
+
+        for row in rows:
+            for key in keys:
+                thislen = len(str(row.get(key,"")))
+                lens[key] = max(lens.get(key,0), thislen)
+
+        for key in keys:
+            print "%*s" % (lens[key], key),
+        print
+
+        for row in rows:
+            for key in keys:
+                print "%*s" % (lens[key], str(row.get(key,""))),
+            print
+
+    def schema_to_cols(self, schema):
+        fields = schema["fields"]
+
+        colTypes = {"STRING": "string", "INTEGER": "number", "FLOAT": "number", "TIMESTAMP": "date"}
+
+        cols = []
+        i=0
+        for field in fields:
+            col = {"type": colTypes[field["type"]],
+                   "id": "Col%d" % i,
+                   "label": reverse_mappings[self.tableName].get(field["name"],field["name"])}
+            cols.append(col)
+            i=i+1
+
+        return cols
+
+def main():
+    bq = BigQueryAnalytics()
+
+    rows = bq.run_query("select %hostname,SUM(%bytes_sent) from [vicci.demoevents] group by %hostname")
+
+    bq.dump_table(rows)
+
+if __name__ == "__main__":
+    main()
diff --git a/planetstack/hpc_wizard/hpc_wizard.py b/planetstack/hpc_wizard/hpc_wizard.py
new file mode 100644 (file)
index 0000000..5c5a3f9
--- /dev/null
@@ -0,0 +1,340 @@
+import datetime
+import os
+import operator
+import socket
+import pytz
+import json
+import random
+import sys
+import time
+
+if os.path.exists("/home/smbaker/projects/vicci/plstackapi/planetstack"):
+    sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
+else:
+    sys.path.append("/opt/planetstack")
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+from django import db
+from django.db import connection
+from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice, Service
+from hpc.models import HpcService, ServiceProvider, ContentProvider, OriginServer, CDNPrefix, HpcService
+
+# amount of time in milliseconds which will be queried for HPC statistics.
+QUERY_TIME=150000
+
+# Constants used for computing 'hotness'
+#    BLUE_LOAD = MB/s which should be a "0" on the hotness scale
+#    RED_LOAD = MB/s which should be a "1" on the hotness scale
+BLUE_LOAD=5000000
+RED_LOAD=15000000
+
+MAX_LOAD=RED_LOAD
+
+def log(what, showdate=True):
+    try:
+        if showdate:
+            file("/tmp/scott-hpcwizard.log", "a").write(time.strftime("%Y-%m-%d %H:%M:%S ", time.gmtime()))
+        file("/tmp/scott-hpcwizard.log", "a").write("%s\n" % what)
+    except:
+        pass # uh oh
+
+def log_exc(what):
+    log(what)
+    log(traceback.format_exc(), showdate=False)
+
+def avg(x):
+    return float(sum(x))/len(x)
+
+def format_float(x):
+    try:
+        return "%10.5f" % x
+    except:
+        return str(x)
+
+class HpcWizard:
+    def __init__(self):
+        try:
+            self.hpcService = HpcService.objects.get()
+        except:
+            # OpenCloud.us currently has a Service object instantiated instead
+            # of a HpcService. Fallback for now.
+            self.hpcService = Service.objects.get(name="HPC Service")
+
+        self.hpcQueryThread = None
+
+    def get_hpc_slices(self):
+        try:
+            slices = self.hpcService.slices.all()
+        except:
+            # BUG in data model -- Slice.service has related name 'service' and
+            #                      it should be 'slices'
+            slices = self.hpcService.service.all()
+        return slices
+
+    def get_hpc_slivers(self):
+        slivers = []
+        for slice in self.get_hpc_slices():
+            for sliver in slice.slivers.all():
+                slivers.append(sliver)
+        return slivers
+
+    def fill_site_nodes(self, site, hpc_slivers=None):
+        if hpc_slivers is None:
+            hpc_slivers = self.get_hpc_slivers()
+
+        site.availNodes = []
+        site.hpcNodes = []
+        for node in site.nodes.all():
+            has_hpc = False
+
+            for sliver in node.slivers.all():
+                if sliver in hpc_slivers:
+                    has_hpc = True
+
+            if has_hpc:
+                site.hpcNodes.append(node)
+            else:
+                site.availNodes.append(node)
+
+    def merge_site_statistics(self, sites):
+        """ this does it based on the sumb of all bandwidth
+
+            The issue here is that we the computed load reacts immediately to
+            the addition or deletion of nodes. i.e. 5 nodes at 80% + 1 node at
+            0% = average load 66%.
+        """
+        site_dict = {}
+        for site in self.hpcQueryThread.site_rows:
+            site_dict[site["site"]] = site
+
+        for site in sites:
+            if site.name in site_dict:
+                site.bytes_sent = site_dict[site.name]["sum_bytes_sent"]
+                time_delta = site_dict[site.name]["time_delta"]
+                computed_duration = (int(time_delta/30)+1)*30
+                if (computed_duration > 0):
+                    site.bandwidth = site.bytes_sent/computed_duration
+                if len(site.hpcNodes)>0:
+                    # figure out how many bytes_sent would be represented
+                    # by blue and red
+                    blue_load = len(site.hpcNodes) * BLUE_LOAD * computed_duration
+                    red_load = len(site.hpcNodes) * RED_LOAD * computed_duration
+                    max_load = len(site.hpcNodes) * MAX_LOAD * computed_duration
+
+                    site.hotness = (min(red_load, max(blue_load, float(site.bytes_sent))) - blue_load)/(red_load-blue_load)
+                    site.load = int(min(100, site.bytes_sent*100/max_load))
+
+                    file("/tmp/scott2.txt","a").write("%s %d %0.2f %0.2f %0.2f %0.2f %d\n" % (site.name, site.bytes_sent, blue_load, red_load, site.hotness, time_delta, computed_duration))
+
+    def merge_site_statistics_new(self, sites):
+        """ This does it based on max load
+
+            Advantage of this method is that since we're effectively reporting
+            the maximally loaded node, we don't get instantaneous reactions
+            to adding additional nodes. On the contrary, it will take a while
+            for the load to balance from the loaded node to the new less-loaded
+            node.
+        """
+        site_dict = {}
+        for site in self.hpcQueryThread.site_rows:
+            site_dict[site["site"]] = site
+
+        for site in sites:
+            if site.name in site_dict:
+                site.max_avg_bandwidth = site_dict[site.name]["max_avg_bandwidth"]
+                site.bytes_sent = site_dict[site.name]["sum_bytes_sent"]
+
+                site.hotness = min(1.0, float(max(BLUE_LOAD, site.max_avg_bandwidth) - BLUE_LOAD) / (RED_LOAD-BLUE_LOAD))
+                site.load = int(site.max_avg_bandwidth*100/MAX_LOAD)
+
+                # we still need site["bandwidth"] for the summary statistics
+                time_delta = site_dict[site.name]["time_delta"]
+                computed_duration = (int(time_delta/30)+1)*30
+                if (computed_duration > 0):
+                    site.bandwidth = site.bytes_sent/computed_duration
+                else:
+                    site.bandwidth = 0
+
+                if len(site.hpcNodes)>0:
+                    file("/tmp/scott3.txt","a").write("%s %d %0.2f %d %0.2f\n" % (site.name, site.bytes_sent, site.hotness, site.load, site.bandwidth))
+
+    def get_sites(self):
+        sites = list(Site.objects.all())
+
+        for site in sites:
+            self.fill_site_nodes(site, self.get_hpc_slivers())
+            site.load = 0
+            site.hotness = 0
+            site.bandwidth = 0
+            site.numNodes = len(site.hpcNodes) + len(site.availNodes)
+
+        if (self.hpcQueryThread is not None) and (self.hpcQueryThread.is_stalled()):
+            self.initialize_statistics()
+
+        # merge in the statistics data if it is available
+        if self.hpcQueryThread and self.hpcQueryThread.data_version>0:
+            self.merge_site_statistics(sites)
+
+        # django will leak extraordinary amounts of memory without this line
+        db.reset_queries()
+
+        return sites
+
+    def get_nodes_to_sites(self):
+        nodes_to_sites = {}
+
+        sites = list(Site.objects.all())
+
+        for site in sites:
+            for node in site.nodes.all():
+                nodes_to_sites[node.name] = site.name
+
+        return nodes_to_sites
+
+    def get_slice_sites(self, slice_name):
+        sites = list(Site.objects.all())
+        slivers = list(Slice.objects.get(name=slice_name).slivers.all())
+        for site in sites:
+            self.fill_site_nodes(site, slivers)
+        return sites
+
+    def get_sites_for_view(self):
+        sites = {}
+        for site in self.get_sites():
+            if site.name in ["ON.Lab", "I2 Atlanta"]:
+                continue
+
+            d = {"lat": float(site.location.latitude),
+                 "long": float(site.location.longitude),
+                 "health": 0,
+                 "numNodes": site.numNodes,
+                 "numHPCSlivers": len(site.hpcNodes),
+                 "siteUrl": str(site.site_url),
+                 "hot": getattr(site,"hotness",0.0),
+                 "load": getattr(site,"load",0)}
+            sites[str(site.name)] = d
+
+        import pprint
+        f = file("/tmp/scott.txt","w")
+        pprint.pprint(sites, f)
+        f.close()
+
+        return sites
+
+    def get_summary_for_view(self):
+        total_slivers = 0
+        total_bandwidth = 0
+        average_cpu = 0
+
+        sites = [site for site in self.get_sites() if len(site.hpcNodes)>0]
+
+        total_slivers = sum( [len(site.hpcNodes) for site in sites] )
+        total_bandwidth = sum( [site.bandwidth for site in sites] )
+        average_cpu = int(avg( [site.load for site in sites] ))
+
+        return {"total_slivers": total_slivers,
+                "total_bandwidth": total_bandwidth,
+                "average_cpu": average_cpu}
+
+    def initialize_statistics(self):
+        from query import HpcQueryThread
+
+        if (self.hpcQueryThread is not None):
+            log("dropping old query thread")
+            self.hpcQueryThread.please_die = True
+            self.hpcQueryThread = None
+
+        log("launching new query thread")
+
+        nodes_to_sites = self.get_nodes_to_sites()
+        self.hpcQueryThread = HpcQueryThread(nodes_to_sites = nodes_to_sites, timeStart=-QUERY_TIME, slice="HyperCache")
+
+    def get_site(self, site_name):
+        site = Site.objects.get(name=site_name)
+        self.fill_site_nodes(site)
+        return site
+
+    def increase_slivers(self, site_name, count):
+        site = self.get_site(site_name)
+        hpc_slice = self.get_hpc_slices()[0]
+        while (len(site.availNodes) > 0) and (count > 0):
+            node = site.availNodes.pop()
+            hostname = node.name
+            sliver = Sliver(name=node.name,
+                            slice=hpc_slice,
+                            node=node,
+                            image = Image.objects.all()[0],
+                            creator = User.objects.get(email="scott@onlab.us"),
+                            deploymentNetwork=node.deployment,
+                            numberCores = 1,
+                            ip=socket.gethostbyname(hostname))
+            sliver.save()
+
+            print "created sliver", sliver
+
+            site.hpcNodes.append(node)
+
+            count = count - 1
+
+    def decrease_slivers(self, site_name, count):
+        site = self.get_site(site_name)
+        hpc_slices = self.get_hpc_slices()
+        while (len(site.hpcNodes) > 0) and (count > 0):
+            node = site.hpcNodes.pop()
+            for sliver in node.slivers.all():
+                if sliver.slice in hpc_slices:
+                     print "deleting sliver", sliver
+                     sliver.delete()
+
+            site.availNodes.append(node)
+            count = count - 1
+
+    def dump(self):
+        print "slices:"
+        for slice in self.get_hpc_slices():
+            print "  ", slice
+
+        print "sites:"
+        print "%20s %10s %10s %10s %10s %10s %10s" % ("name", "avail", "hpc", "lat", "long", "sent", "hot")
+        for site in self.get_sites():
+            print "%20s %10d %10d %10s %10s %10d %10.2f" % (site.name,
+                                                            len(site.availNodes),
+                                                            len(site.hpcNodes),
+                                                            format_float(site.location.latitude),
+                                                            format_float(site.location.longitude),
+                                                            getattr(site,"bytes_sent",0),
+                                                            getattr(site,"hotness",0.5))
+
+        #print "slivers:"
+        #for sliver in self.get_hpc_slivers():
+        #    print "  ", sliver
+
+glo_hpc_wizard = None
+
+def get_hpc_wizard():
+    global glo_hpc_wizard
+
+    if (glo_hpc_wizard is None):
+        glo_hpc_wizard = HpcWizard()
+#        glo_hpc_wizard.initialize_statistics()
+
+    return glo_hpc_wizard
+
+def main():
+    x = HpcWizard()
+
+    # initialized the Statistics thread, and wait for some data to show up
+    x.initialize_statistics()
+    while x.hpcQueryThread.data_version==0:
+       time.sleep(1)
+
+    x.dump()
+
+    # quick test of the increase / decrease functions
+
+    x.increase_slivers("Princeton", 1)
+    x.decrease_slivers("Princeton", 1)
+
+if __name__=="__main__":
+    main()
+
diff --git a/planetstack/hpc_wizard/planetstack_analytics.py b/planetstack/hpc_wizard/planetstack_analytics.py
new file mode 100644 (file)
index 0000000..75462d4
--- /dev/null
@@ -0,0 +1,477 @@
+from bigquery_analytics import BigQueryAnalytics, BIGQUERY_AVAILABLE
+import datetime
+import re
+import os
+import sys
+import time
+import json
+import traceback
+import urllib2
+
+if os.path.exists("/home/smbaker/projects/vicci/plstackapi/planetstack"):
+    sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
+else:
+    sys.path.append("/opt/planetstack")
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+from django.conf import settings
+from django import db
+from django.db import connection
+from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice, Service
+
+BLUE_LOAD=5000000
+RED_LOAD=15000000
+
+glo_cached_queries = {}
+
+class PlanetStackAnalytics(BigQueryAnalytics):
+    def __init__(self, tableName=None):
+        if not tableName:
+            tableName = settings.BIGQUERY_TABLE
+
+        BigQueryAnalytics.__init__(self, tableName)
+
+    def service_to_sliceNames(self, serviceName):
+        service=Service.objects.get(name=serviceName)
+        try:
+            slices = service.slices.all()
+        except:
+            # BUG in data model -- Slice.service has related name 'service' and
+            #                      it should be 'slices'
+            slices = service.service.all()
+
+        return [slice.name for slice in slices]
+
+    def compose_query(self, filter={}, timeBucket="60", avg=[], sum=[], count=[], computed=[], val=[], groupBy=["Time"], orderBy=["Time"], tableName=None, latest=False, maxAge=60*60):
+        if tableName is None:
+            tableName = self.tableName
+
+        maxAge = maxAge * 1000
+        tablePart = "[%s.%s@-%d--1]" % ("vicci", tableName, maxAge)
+
+        fields = []
+        fieldNames = []
+        srcFieldNames = ["time"]
+
+        fields.append("SEC_TO_TIMESTAMP(INTEGER(TIMESTAMP_TO_SEC(time)/%s)*%s) as Time" % (str(timeBucket),str(timeBucket)))
+        #fields.append("INTEGER(TIMESTAMP_TO_SEC(time)/%s)*%s as Time" % (str(timeBucket),str(timeBucket)))
+
+        for fieldName in avg:
+            fields.append("AVG(%s) as avg_%s" % (fieldName, fieldName.replace("%","")))
+            fieldNames.append("avg_%s" % fieldName.replace("%",""))
+            srcFieldNames.append(fieldName)
+
+        for fieldName in sum:
+            fields.append("SUM(%s) as sum_%s" % (fieldName, fieldName.replace("%","")))
+            fieldNames.append("sum_%s" % fieldName.replace("%",""))
+            srcFieldNames.append(fieldName)
+
+        for fieldName in count:
+            fields.append("COUNT(distinct %s) as count_%s" % (fieldName, fieldName.replace("%","")))
+            fieldNames.append("count_%s" % fieldName.replace("%",""))
+            srcFieldNames.append(fieldName)
+
+        for fieldName in val:
+            fields.append(fieldName)
+            fieldNames.append(fieldName)
+            srcFieldNames.append(fieldName)
+
+        for fieldName in computed:
+            operator = "/"
+            parts = fieldName.split("/")
+            computedFieldName = "computed_" + parts[0].replace("%","")+"_div_"+parts[1].replace("%","")
+            if len(parts)==1:
+                operator = "*"
+                parts = computed.split("*")
+                computedFieldName = "computed_" + parts[0].replace("%","")+"_mult_"+parts[1].replace("%","")
+            fields.append("SUM(%s)%sSUM(%s) as %s" % (parts[0], operator, parts[1], computedFieldName))
+            fieldNames.append(computedFieldName)
+            srcFieldNames.append(parts[0])
+            srcFieldNames.append(parts[1])
+
+        for fieldName in groupBy:
+            if (fieldName not in ["Time"]):
+                fields.append(fieldName)
+                fieldNames.append(fieldName)
+                srcFieldNames.append(fieldName)
+
+        fields = ", ".join(fields)
+
+        where = []
+
+        if filter.get("slice",None):
+            where.append("%%slice='%s'" % filter["slice"])
+        if filter.get("site",None):
+            where.append("%%site='%s'" % filter["site"])
+        if filter.get("node",None):
+            where.append("%%hostname='%s'" % filter["node"])
+        if filter.get("event",None):
+            where.append("event='%s'" % filter["event"])
+        if filter.get("service",None):
+            sliceNames = self.service_to_sliceNames(filter["service"])
+            if sliceNames:
+                where.append("(" + " OR ".join(["%%slice='%s'" % sliceName for sliceName in sliceNames]) +")")
+
+        if where:
+            where = " WHERE " + " AND ".join(where)
+        else:
+            where =""
+
+        if groupBy:
+            groupBySub = " GROUP BY " + ",".join(groupBy + ["%hostname"])
+            groupBy = " GROUP BY " + ",".join(groupBy)
+        else:
+            groupBySub = " GROUP BY %hostname"
+            groupBy = ""
+
+        if orderBy:
+            orderBy = " ORDER BY " + ",".join(orderBy)
+        else:
+            orderBy = ""
+
+        if latest:
+            latestFields = ["table1.%s as %s" % (x,x) for x in srcFieldNames]
+            latestFields = ", ".join(latestFields)
+            tablePart = """(SELECT %s FROM %s AS table1
+                            JOIN
+                                (SELECT %%hostname, event, max(time) as maxtime from %s GROUP BY %%hostname, event) AS latest
+                            ON
+                                table1.%%hostname = latest.%%hostname AND table1.event = latest.event AND table1.time = latest.maxtime)""" % (latestFields, tablePart, tablePart)
+
+        if computed:
+            subQuery = "SELECT %%hostname, %s FROM %s" % (fields, tablePart)
+            if where:
+                subQuery = subQuery + where
+            subQuery = subQuery + groupBySub
+
+            sumFields = []
+            for fieldName in fieldNames:
+                if fieldName.startswith("avg"):
+                    sumFields.append("AVG(%s) as avg_%s"%(fieldName,fieldName))
+                    sumFields.append("MAX(%s) as max_%s"%(fieldName,fieldName))
+                elif (fieldName.startswith("count")) or (fieldName.startswith("sum")) or (fieldName.startswith("computed")):
+                    sumFields.append("SUM(%s) as sum_%s"%(fieldName,fieldName))
+                else:
+                    sumFields.append(fieldName)
+
+            sumFields = ",".join(sumFields)
+
+            query = "SELECT %s, %s FROM (%s)" % ("Time", sumFields, subQuery)
+            if groupBy:
+                query = query + groupBy
+            if orderBy:
+                query = query + orderBy
+        else:
+            query = "SELECT %s FROM %s" % (fields, tablePart)
+            if where:
+                query = query + " " + where
+            if groupBy:
+                query = query + groupBy
+            if orderBy:
+                query = query + orderBy
+
+        return query
+
+    def get_list_from_req(self, req, name, default=[]):
+        value = req.GET.get(name, None)
+        if not value:
+            return default
+        value=value.replace("@","%")
+        return value.split(",")
+
+    def format_result(self, format, result, query, dataSourceUrl):
+        if not BIGQUERY_AVAILABLE:
+            msg = "BigQuery Statistics Unavaiable"
+        else:
+            msg = None
+
+        if (format == "json_dicts"):
+            result = {"query": query, "rows": result, "dataSourceUrl": dataSourceUrl, "msg": msg}
+            return ("application/javascript", json.dumps(result))
+
+        elif (format == "json_arrays"):
+            new_result = []
+            for row in result:
+                new_row = []
+                for key in sorted(row.keys()):
+                    new_row.append(row[key])
+                new_result.append(new_row)
+                new_result = {"query": query, "rows": new_result, "msg": msg}
+            return ("application/javascript", json.dumps(new_result))
+
+        elif (format == "html_table"):
+            new_rows = []
+            for row in result:
+                new_row = []
+                for key in sorted(row.keys()):
+                    new_row.append("<TD>%s</TD>" % str(row[key]))
+                new_rows.append("<TR>%s</TR>" % "".join(new_row))
+
+            new_result = "<TABLE>%s</TABLE>" % "\n".join(new_rows)
+
+            return ("text/html", new_result)
+
+    def merge_datamodel_sites(self, rows, slice=None):
+        """ For a query that included "site" in its groupby, merge in the
+            opencloud site information.
+        """
+
+        if slice:
+            try:
+                slice = Slice.objects.get(name=slice)
+            except:
+                slice = None
+
+        for row in rows:
+            sitename = row["site"]
+            try:
+                model_site = Site.objects.get(name=sitename)
+            except:
+                # we didn't find it in the data model
+                continue
+
+            allocated_slivers = 0
+            if model_site and slice:
+                for sliver in slice.slivers.all():
+                    if sliver.node.site == model_site:
+                        allocated_slivers = allocated_slivers + 1
+
+            row["lat"] = float(model_site.location.latitude)
+            row["long"] = float(model_site.location.longitude)
+            row["url"] = model_site.site_url
+            row["numNodes"] = model_site.nodes.count()
+            row["allocated_slivers"] = allocated_slivers
+
+            max_cpu = row.get("max_avg_cpu", row.get("max_cpu",0))
+            cpu=float(max_cpu)/100.0
+            row["hotness"] = max(0.0, ((cpu*RED_LOAD) - BLUE_LOAD)/(RED_LOAD-BLUE_LOAD))
+
+    def compose_cached_query(self, querySpec='default'):
+        """ Compose a query that returns the 'most recent' row for each (hostname, event)
+            pair.
+
+            Note that groupByFields cannot contain any values that are 'Null' or those
+            rows will be excluded. For example, if groupByFields includes cp, then
+            there will be no libvirt_event rows, since libvirt_event does not have
+            cp.
+
+            This means we can't really have 'one query to rule them'. Settle on
+            having a couple of different queries, and have the caller specify
+            which one he wants.
+        """
+
+        fieldNames = ["%hostname", "%bytes_sent", "%bytes_hit", "%healthy", "time", "event", "%site", "%elapsed", "%cpu"]
+
+        if querySpec=="default":
+            groupByFields = ["%hostname", "event"]
+        elif (querySpec=="hpc"):
+            fieldNames.append("%cp")
+            groupByFields = ["%hostname", "event", "%cp"]
+        else:
+            raise ValueError("Unknown queryspec %s" % querySpec)
+
+        fields = ["table1.%s AS %s" % (x,x) for x in fieldNames]
+        fields = ", ".join(fields)
+
+        tableDesc = "%s.%s" % (self.projectName, self.tableName)
+
+        groupByOn = ["table1.time = latest.maxtime"]
+        for field in groupByFields:
+            groupByOn.append("table1.%s = latest.%s" % (field, field))
+
+        groupByOn = " AND ".join(groupByOn)
+        groupByFields = ", ".join(groupByFields)
+
+        base_query = "SELECT %s FROM [%s@-3600000--1] AS table1 JOIN (SELECT %s, max(time) as maxtime from [%s@-3600000--1] GROUP BY %s) AS latest ON %s" % \
+                      (fields, tableDesc, groupByFields, tableDesc, groupByFields, groupByOn)
+
+        return base_query
+
+    def get_cached_query_results(self, q, wait=True):
+        global glo_cached_queries
+
+        if q in glo_cached_queries:
+            if (time.time() - glo_cached_queries[q]["time"]) <= 60:
+                print "using cached query"
+                return glo_cached_queries[q]["rows"]
+
+        if not wait:
+            return None
+
+        print "refreshing cached query"
+        result = self.run_query(q)
+        glo_cached_queries[q] = {"time": time.time(), "rows": result}
+
+        return result
+
+    def process_request(self, req):
+        print req.GET
+
+        tqx = req.GET.get("tqx", None)
+
+        slice = req.GET.get("slice", None)
+        site = req.GET.get("site", None)
+        node = req.GET.get("node", None)
+        service = req.GET.get("service", None)
+        event = req.GET.get("event", "libvirt_heartbeat")
+        cp = req.GET.get("cp", None)
+
+        format = req.GET.get("format", "json_dicts")
+
+        timeBucket = int(req.GET.get("timeBucket", 60))
+        avg = self.get_list_from_req(req, "avg")
+        sum = self.get_list_from_req(req, "sum")
+        count = self.get_list_from_req(req, "count")
+        computed = self.get_list_from_req(req, "computed")
+        groupBy = self.get_list_from_req(req, "groupBy", ["Time"])
+        orderBy = self.get_list_from_req(req, "orderBy", ["Time"])
+
+        maxRows = req.GET.get("maxRows", None)
+        mergeDataModelSites = req.GET.get("mergeDataModelSites", None)
+
+        maxAge = int(req.GET.get("maxAge", 60*60))
+
+        cached = req.GET.get("cached", None)
+        cachedGroupBy = self.get_list_from_req(req, "cachedGroupBy", ["doesnotexist"])
+
+        filter={}
+        if slice:
+            filter["slice"] = slice
+        if site:
+            filter["site"] = site
+        if node:
+            filter["hostname"] = node
+        if event:
+            filter["event"] = event
+        if cp:
+            filter["cp"] = cp
+
+        q = self.compose_query(filter, timeBucket, avg, sum, count, computed, [], groupBy, orderBy, maxAge=maxAge)
+
+        print q
+
+        dataSourceUrl = "http://" + req.META["SERVER_NAME"] + ":" + req.META["SERVER_PORT"] + req.META["PATH_INFO"] + "?" + req.META["QUERY_STRING"].replace("format=","origFormat=").replace("%","%25") + "&format=charts";
+
+        if (format=="dataSourceUrl"):
+            result = {"dataSourceUrl": dataSourceUrl}
+            return ("application/javascript", result)
+
+        elif (format=="raw"):
+            result = self.run_query_raw(q)
+            result["dataSourceUrl"] = dataSourceUrl
+
+            result = json.dumps(result);
+
+            return ("application/javascript", result)
+
+        elif (format=="nodata"):
+            result = {"dataSourceUrl": dataSourceUrl, "query": q}
+            result = json.dumps(result);
+            return {"application/javascript", result}
+
+        elif (format=="charts"):
+            bq_result = self.run_query_raw(q)
+
+            # cloudscrutiny code is probably better!
+            table = {}
+            table["cols"] = self.schema_to_cols(bq_result["schema"])
+            rows = []
+            if "rows" in bq_result:
+                for row in bq_result["rows"]:
+                    rowcols = []
+                    for (colnum,col) in enumerate(row["f"]):
+                        if (colnum==0):
+                            dt = datetime.datetime.fromtimestamp(float(col["v"]))
+                            rowcols.append({"v": 'new Date("%s")' % dt.isoformat()})
+                        else:
+                            try:
+                                rowcols.append({"v": float(col["v"])})
+                            except:
+                                rowcols.append({"v": col["v"]})
+                    rows.append({"c": rowcols})
+            table["rows"] = rows
+
+            if tqx:
+                reqId = tqx.strip("reqId:")
+            else:
+                reqId = "0"
+
+            result = {"status": "okColumnChart", "reqId": reqId, "table": table, "version": "0.6"}
+
+            result = "google.visualization.Query.setResponse(" + json.dumps(result) + ");"
+
+            def unquote_it(x): return x.group()[1:-1].replace('\\"', '"')
+
+            p = re.compile(r'"new Date\(\\"[^"]*\\"\)"')
+            result=p.sub(unquote_it, result)
+
+            return ("application/javascript", result)
+
+        else:
+            if cached:
+                results = self.get_cached_query_results(self.compose_cached_query(cached))
+
+                result = self.postprocess_results(results, filter=filter, sum=sum, count=count, avg=avg, computed=computed, maxDeltaTime=120, groupBy=cachedGroupBy)
+            else:
+                result = self.run_query(q)
+
+            if maxRows:
+                result = result[-int(maxRows):]
+
+            if mergeDataModelSites:
+                self.merge_datamodel_sites(result)
+
+            return self.format_result(format, result, q, dataSourceUrl)
+
+def DoPlanetStackAnalytics(request):
+    bq = PlanetStackAnalytics()
+    result = bq.process_request(request)
+
+    return result
+
+def main():
+    bq = PlanetStackAnalytics(tableName="demoevents")
+
+    q = bq.compose_cached_query()
+    results = bq.run_query(q)
+
+    #results = bq.postprocess_results(results,
+    #                                 filter={"slice": "HyperCache"},
+    #                                 groupBy=["site"],
+    #                                 computed=["bytes_sent/elapsed"],
+    #                                 sum=["bytes_sent", "computed_bytes_sent_div_elapsed"], avg=["cpu"],
+    #                                 maxDeltaTime=60)
+
+    #results = bq.postprocess_results(results, filter={"slice": "HyperCache"}, maxi=["cpu"], count=["hostname"], computed=["bytes_sent/elapsed"], groupBy=["Time", "site"], maxDeltaTime=80)
+
+    results = bq.postprocess_results(results,filter={"event": "libvirt_heartbeat"}, avg=["cpu"], count=["hostname"], groupBy=["doesnotexist"])
+
+    bq.dump_table(results)
+
+    sys.exit(0)
+
+    q=bq.compose_query(sum=["%bytes_sent"], avg=["%cpu"], latest=True, groupBy=["Time", "%site"])
+    print q
+    bq.dump_table(bq.run_query(q))
+
+    q=bq.compose_query(avg=["%cpu","%bandwidth"], count=["%hostname"], slice="HyperCache")
+    print q
+    bq.dump_table(bq.run_query(q))
+
+    q=bq.compose_query(computed=["%bytes_sent/%elapsed"])
+    print
+    print q
+    bq.dump_table(bq.run_query(q))
+
+    q=bq.compose_query(timeBucket=60*60, avg=["%cpu"], count=["%hostname"], computed=["%bytes_sent/%elapsed"])
+    print
+    print q
+    bq.dump_table(bq.run_query(q))
+
+if __name__ == "__main__":
+    main()
+
+
+
+
+
diff --git a/planetstack/hpc_wizard/query.py b/planetstack/hpc_wizard/query.py
new file mode 100644 (file)
index 0000000..4ddf4f6
--- /dev/null
@@ -0,0 +1,276 @@
+import re
+import base64
+import requests
+import urllib
+import json
+import httplib2
+import threading
+import os
+import time
+import traceback
+
+from apiclient.discovery import build
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.file import Storage
+from oauth2client.tools import run_flow,run
+
+"""
+yum -y install python-httplib2
+easy_install python_gflags
+easy_install google_api_python_client
+"""
+
+
+PROJECT_NUMBER = '549187599759'
+
+try:
+    FLOW = flow_from_clientsecrets('/opt/planetstack/hpc_wizard/client_secrets.json',
+                                   scope='https://www.googleapis.com/auth/bigquery')
+except:
+    print "exception while initializing bigquery flow"
+    traceback.print_exc()
+    FLOW = None
+
+MINUTE_MS = 60*1000
+HOUR_MS = 60*60*1000
+
+class HpcQuery:
+    def __init__(self):
+        self.mapping = json.loads(self.fetch_mapping(table="demoevents"))
+        self.reverse_mapping = {v:k for k, v in self.mapping.items()}
+
+    def fetch_mapping(self, m=0, table="events"):
+       req = 'http://cloud-scrutiny.appspot.com/command?action=get_allocations&multiplexer=%d&table=%s'% (m,table)
+       resp = requests.get(req)
+       if (resp.status_code==200):
+               return resp.text
+       else:
+               raise Exception('Error accessing register allocations: %d'%resp.status_code)
+
+    def run_query_old(self, query):
+        req = 'http://cloud-scrutiny.appspot.com/command?action=send_query&q=%s' % urllib.quote(query)
+       resp = requests.get(req)
+       if (resp.status_code==200):
+               return resp.text
+       else:
+               raise Exception('Error running query: %d'%resp.status_code)
+        return resp
+
+    def run_query(self, query):
+       storage = Storage('/opt/planetstack/hpc_wizard/bigquery_credentials.dat')
+       credentials = storage.get()
+
+       if credentials is None or credentials.invalid:
+               credentials = run(FLOW, storage)
+
+       http = httplib2.Http()
+       http = credentials.authorize(http)
+
+       service = build('bigquery', 'v2', http=http)
+
+        body = {"query": query}
+        response = service.jobs().query(projectId=PROJECT_NUMBER, body=body).execute()
+
+        fieldNames = []
+        for field in response["schema"]["fields"]:
+            fieldNames.append(field["name"])
+
+        result = []
+        if "rows" in response:
+            for row in response["rows"]:
+                this_result = {}
+                for (i,column) in enumerate(row["f"]):
+                    this_result[self.reverse_mapping.get(fieldNames[i],fieldNames[i])] = column["v"]
+                result.append(this_result)
+
+        return result
+
+    def remap(self, match):
+        token = match.group()[1:]
+        if token in self.mapping:
+            return self.mapping[token]
+        else:
+            raise Exception('unknown token %s' % token)
+
+    def get_usage(self, cp=None, hostname=None, site=None, slice=None, timeStart=-HOUR_MS, timeStop=-1, groupBy=["%hostname", "%cp"]):
+        where = []
+        if slice is not None:
+            where.append("%slice='" + slice + "'")
+        if cp is not None:
+            where.append("%cp='" + cp + "'")
+        if hostname is not None:
+            where.append("%hostname='" + hostname + "'")
+        if site is not None:
+            where.append("%hostname contains " + site)
+        where.append("%bytes_sent>0")
+        where = "WHERE " + " AND ".join(where)
+
+        if timeStart is not None:
+             tableName = "[vicci.demoevents@%d-%d]" % (timeStart,timeStop)
+        else:
+             tableName = "[vicci.demoevents]"
+
+        query = "SELECT %hostname,%cp,sum(%bytes_sent) as sum_bytes_sent,sum(%bytes_hit) as sum_bytes_hit, AVG(%bandwidth) as avg_bandwidth," + \
+                " MAX(TIMESTAMP_TO_MSEC(time))-MIN(TIMESTAMP_TO_MSEC(time)) as time_delta FROM " + \
+                tableName + " " + where
+
+        if groupBy:
+            query = query + " GROUP BY " + ",".join(groupBy)
+
+        p = re.compile('%[a-zA-z_]*')
+        query = p.sub(self.remap, query)
+
+        rows = self.run_query(query)
+
+        for row in rows:
+            row["sum_bytes_sent"] = int(row.get("sum_bytes_sent",0))
+            row["sum_bytes_hit"] = int(row.get("sum_bytes_hit",0))
+            row["avg_bandwidth"] = int(float(row.get("avg_bandwidth",0)))
+            row["time_delta"] = float(row.get("time_delta",0.0))/1000.0
+
+            elapsed = (timeStop-timeStart)/1000
+            KBps = int(row.get("sum_bytes_sent",0)) / elapsed / 1024
+            row["KBps"] = KBps
+
+        return rows
+
+    def sites_from_usage(self, rows, nodes_to_sites={}):
+        sites = {}
+        for row in rows:
+            hostname = row["hostname"]
+
+            if hostname in nodes_to_sites:
+                site_name = nodes_to_sites[hostname]
+            else:
+                parts = hostname.split(".")
+                if len(parts)<=2:
+                    continue
+                site_name = parts[1]
+
+            if not (site_name in sites):
+                row = row.copy()
+                row["site"] = site_name
+                row["max_avg_bandwidth"] = row["avg_bandwidth"]
+                # sites table doesn't care about hostnames or avg_bandwidth
+                del row["hostname"]
+                del row["avg_bandwidth"]
+                sites[site_name] = row
+            else:
+                site_row = sites[site_name]
+                site_row["sum_bytes_sent"] = site_row["sum_bytes_sent"] + row["sum_bytes_sent"]
+                site_row["sum_bytes_hit"] = site_row["sum_bytes_hit"] + row["sum_bytes_hit"]
+                site_row["max_avg_bandwidth"] = max(site_row["max_avg_bandwidth"], row["avg_bandwidth"])
+                site_row["time_delta"] = max(site_row["time_delta"], row["time_delta"])
+
+        return sites.values()
+
+    def get_usage_sites(self, cp=None, slice=None, timeStart=-HOUR_MS, timeStop=-1):
+        rows = self.get_usage(cp=cp, slice=slice, timeStart=timeStart, timeStop=timeStop)
+
+        return self.sites_from_usage(rows)
+
+    def dump_table(self, rows, keys=None):
+        if not keys:
+            keys = rows[0].keys()
+
+        lens = {}
+        for key in keys:
+            lens[key] = len(key)
+
+        for row in rows:
+            for key in keys:
+                thislen = len(str(row.get(key,"")))
+                lens[key] = max(lens.get(key,0), thislen)
+
+        for key in keys:
+            print "%*s" % (lens[key], key),
+        print
+
+        for row in rows:
+            for key in keys:
+                print "%*s" % (lens[key], str(row.get(key,""))),
+            print
+
+class HpcQueryThread(HpcQuery, threading.Thread):
+    def __init__(self, interval=30, slice=None, timeStart=-HOUR_MS, cp=None, nodes_to_sites={}):
+        threading.Thread.__init__(self)
+        HpcQuery.__init__(self)
+        self.daemon = True
+        self.interval = interval
+        self.timeStart = timeStart
+        self.nodes_to_sites = nodes_to_sites
+        self.slice = slice
+        self.cp = cp
+        self.data_version = 0
+        self.please_die = False
+        self.update_time = time.time()
+        self.start()
+
+    def is_stalled(self):
+        if time.time()-self.update_time > 300:
+            return True
+        else:
+            return False
+
+    def run(self):
+        while not self.please_die:
+            try:
+                self.rows = self.get_usage(timeStart=self.timeStart, cp=self.cp, slice=self.slice)
+                self.site_rows = self.sites_from_usage(self.rows, self.nodes_to_sites)
+                self.update_time = time.time()
+                self.new_data()
+                self.data_version += 1
+            except:
+                file("/tmp/hpcquery_fail.txt","a").write(traceback.format_exc() + "\n")
+            time.sleep(self.interval)
+
+    def new_data(self):
+        pass
+
+class HpcDumpThread(HpcQueryThread):
+    def __init__(self, interval=30, slice=None, timeStart=-HOUR_MS, cp=None):
+        HpcQueryThread.__init__(self, interval, slice, timeStart, cp)
+
+    def new_data(self):
+        os.system("clear")
+
+        print "update %d, data for last %d minutes" % (self.data_version, -self.timeStart/1000/60)
+        print
+
+        self.dump_table(self.rows, ["hostname", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+        print
+        self.dump_table(self.site_rows, ["site", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+        print
+
+
+def main_old():
+    hq = HpcQuery()
+#    print hq.mapping
+
+    print "5 minute"
+    hq.dump_table(hq.get_usage(timeStart=-MINUTE_MS*5), ["hostname", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    print
+    hq.dump_table(hq.get_usage_sites(timeStart=-MINUTE_MS*5), ["site", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    print
+
+    print "1 hour"
+    hq.dump_table(hq.get_usage(), ["hostname", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    print
+    hq.dump_table(hq.get_usage_sites(), ["site", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    print
+
+    print "24 hours"
+    hq.dump_table(hq.get_usage(timeStart=-HOUR_MS*24), ["hostname", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    hq.dump_table(hq.get_usage_sites(timeStart=-HOUR_MS*24), ["site", "cp", "sum_bytes_sent", "sum_bytes_hit", "KBps"])
+    print
+
+def main():
+    hd = HpcDumpThread()
+    while True:
+        time.sleep(30)
+
+if __name__ == "__main__":
+    main()
diff --git a/planetstack/kairos/__init__.py b/planetstack/kairos/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/planetstack/kairos/admin.py b/planetstack/kairos/admin.py
new file mode 100644 (file)
index 0000000..1eeb426
--- /dev/null
@@ -0,0 +1,30 @@
+from django.contrib import admin
+
+from nagios.models import *
+from django import forms
+from django.utils.safestring import mark_safe
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.contrib.auth.forms import ReadOnlyPasswordHashField
+from django.contrib.auth.signals import user_logged_in
+from django.utils import timezone
+from django.contrib.contenttypes import generic
+from suit.widgets import LinkedSelect
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline, SliceROInline,ServiceAttrAsTabROInline, ReadOnlyAwareAdmin
+
+class NagiosServiceAdmin(SingletonAdmin):
+    model = NagiosService
+    verbose_name = "Nagios Service"
+    verbose_name_plural = "Nagios Service"
+    list_display = ("name","enabled")
+    fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description'], 'classes':['suit-tab suit-tab-general']})]
+    inlines = [SliceInline,ServiceAttrAsTabInline]
+
+    user_readonly_inlines = [SliceROInline, ServiceAttrAsTabROInline]
+    suit_form_tabs =(('general', 'Nagios Service Details'),
+        ('slices','Slices'),
+        ('serviceattrs','Additional Attributes'),
+    )
+
+admin.site.register(NagiosService, NagiosServiceAdmin)
+
diff --git a/planetstack/kairos/models.py b/planetstack/kairos/models.py
new file mode 100644 (file)
index 0000000..ed916d7
--- /dev/null
@@ -0,0 +1,14 @@
+from core.models import User,Site,Service,SingletonModel,PlCoreBase, Slice
+import os
+from django.db import models
+from django.forms.models import model_to_dict
+
+# Create your models here.
+
+class KairosDBService(SingletonModel,Service):
+    class Meta:
+        app_label = "kairos"
+        verbose_name = "KairosDB Service"
+
+    def __unicode__(self):  return u'KairosDB Service'
+
diff --git a/planetstack/nagios/__init__.py b/planetstack/nagios/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/planetstack/nagios/admin.py b/planetstack/nagios/admin.py
new file mode 100644 (file)
index 0000000..156e376
--- /dev/null
@@ -0,0 +1,30 @@
+from django.contrib import admin
+
+from kairos.models import *
+from django import forms
+from django.utils.safestring import mark_safe
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.contrib.auth.forms import ReadOnlyPasswordHashField
+from django.contrib.auth.signals import user_logged_in
+from django.utils import timezone
+from django.contrib.contenttypes import generic
+from suit.widgets import LinkedSelect
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline, SliceROInline,ServiceAttrAsTabROInline, ReadOnlyAwareAdmin
+
+class KairosDBServiceAdmin(SingletonAdmin):
+    model = KairosDBService
+    verbose_name = "KairosDB Service"
+    verbose_name_plural = "KairosDB Service"
+    list_display = ("name","enabled")
+    fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description'], 'classes':['suit-tab suit-tab-general']})]
+    inlines = [SliceInline,ServiceAttrAsTabInline]
+
+    user_readonly_inlines = [SliceROInline, ServiceAttrAsTabROInline]
+    suit_form_tabs =(('general', 'KairosDB Service Details'),
+        ('slices','Slices'),
+        ('serviceattrs','Additional Attributes'),
+    )
+
+admin.site.register(KairosDBService, KairosDBServiceAdmin)
+
diff --git a/planetstack/nagios/models.py b/planetstack/nagios/models.py
new file mode 100644 (file)
index 0000000..ec7b6bb
--- /dev/null
@@ -0,0 +1,14 @@
+from core.models import User,Site,Service,SingletonModel,PlCoreBase, Slice
+import os
+from django.db import models
+from django.forms.models import model_to_dict
+
+# Create your models here.
+
+class NagiosService(SingletonModel,Service):
+    class Meta:
+        app_label = "nagios"
+        verbose_name = "Nagios Service"
+
+    def __unicode__(self):  return u'Nagios Service'
+
diff --git a/planetstack/nginx/planetstack.conf b/planetstack/nginx/planetstack.conf
new file mode 100644 (file)
index 0000000..d25ab0b
--- /dev/null
@@ -0,0 +1,22 @@
+upstream backend {
+  # least_conn;   
+  server 127.0.0.1:9001;
+  server unix:/var/run/planetstack.uwsgi.sock;
+}
+
+
+server {
+    listen 8081;
+    server_name 128.112.139.48;
+
+    location /static/ {
+        alias /opt/planetstack/core/static/;
+        expires 30d;
+        access_log off;
+    }
+
+    location / {
+        include /etc/nginx/uwsgi_params;
+        uwsgi_pass backend;
+    }
+}
index 0d6c550..d9a63be 100644 (file)
@@ -24,8 +24,9 @@ if (not observer_disabled):
             print "Exception in Observer. This should not disrupt the front end. %s"%str(e)
 
 else:
-    def notify_observer(model=None, delete=False):
-#        if (print_once):
-#            print "The observer is disabled"
-#            print_once = False
+    def notify_observer(model=None, delete=False, pk=None, model_dict={}):
+        global print_once
+        if (print_once):
+            print "The observer is disabled"
+            print_once = False
         return
index d8ae306..293a325 100644 (file)
@@ -1,17 +1,24 @@
 import threading
+import time
 from observer.event_loop import PlanetStackObserver
 from observer.event_manager import EventListener
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
 
 class Backend:
     
     def run(self):
-        # start the openstack observer
-        observer = PlanetStackObserver()
-        observer_thread = threading.Thread(target=observer.run)
-        observer_thread.start()
+        try:
+            # start the openstack observer
+            observer = PlanetStackObserver()
+            observer_thread = threading.Thread(target=observer.run)
+            observer_thread.start()
+            
+            # start event listene
+            event_manager = EventListener(wake_up=observer.wake_up)
+            event_manager_thread = threading.Thread(target=event_manager.run)
+            event_manager_thread.start()
+        except:
+            logger.log_exc("Exception in child thread")
 
-        # start event listene
-        event_manager = EventListener(wake_up=observer.wake_up)
-        event_manager_thread = threading.Thread(target=event_manager.run)
-        event_manager_thread.start()
-                
index 51f9fcb..0d21fda 100644 (file)
@@ -1,17 +1,19 @@
-from core.models import Network
-from deleter import Deleter
+from core.models import Network, NetworkDeployments
+from observer.deleter import Deleter
+from observer.deleters.network_deployment_deleter import NetworkDeploymentDeleter
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
 
 class NetworkDeleter(Deleter):
     model='Network'
 
     def call(self, pk):
         network = Network.objects.get(pk=pk) 
-        if (network.router_id) and (network.subnet_id):
-            self.driver.delete_router_interface(network.router_id, network.subnet_id)
-        if network.subnet_id:
-            self.driver.delete_subnet(network.subnet_id)
-        if network.router_id:
-            self.driver.delete_router(network.router_id)
-        if network.network_id:
-            self.driver.delete_network(network.network_id)
+        network_deployment_deleter = NetworkDeploymentDeleter()
+        for network_deployment in NetworkDeployments.objects.filter(network=network):
+            try:
+                network_deployment_deleter(network_deployment.id)    
+            except:
+                logger.log_exc("Failed to delte network deployment %s" % network_deployment)
         network.delete()
diff --git a/planetstack/observer/deleters/network_deployment_deleter.py b/planetstack/observer/deleters/network_deployment_deleter.py
new file mode 100644 (file)
index 0000000..72b10b2
--- /dev/null
@@ -0,0 +1,21 @@
+from core.models import Network, NetworkDeployments
+from observer.deleter import Deleter
+from openstack.driver import OpenStackDriver
+
+class NetworkDeploymentDeleter(Deleter):
+    model='NetworkDeployment'
+
+    def call(self, pk):
+        network_deployment = NetworkDeployments.objects.get(pk=pk)
+        driver = OpenStackDriver().client_driver(caller=network_deployment.network.owner.creator,
+                                                 tenant=network_deployment.network.owner.name,
+                                                 deployment=network_deployment.deployment.name)
+        if (network_deployment.router_id) and (network_deployment.subnet_id):
+            driver.delete_router_interface(network_deployment.router_id, network_deployment.subnet_id)
+        if network_deployment.subnet_id:
+            driver.delete_subnet(network_deployment.subnet_id)
+        if network_deployment.router_id:
+            driver.delete_router(network_deployment.router_id)
+        if network_deployment.net_id:
+            driver.delete_network(network_deployment.net_id)
+        network_deployment.delete()
index bb29c94..c97dee1 100644 (file)
@@ -1,11 +1,14 @@
-from core.models import Site
-from observer.delete import Deleter
+from core.models import Site, SiteDeployments
+from observer.deleter import Deleter
+from observer.deleters.site_deployment_deleter import SiteDeploymentDeleter
 
 class SiteDeleter(Deleter):
     model='Site'
     
     def call(self, pk):
         site = Site.objects.get(pk=pk)
-        if site.tenant_id:
-            self.driver.delete_tenant(site.tenant_id)
+        site_deployments = SiteDeployments.objects.filter(site=site)
+        site_deployment_deleter = SiteDeploymentDeleter()
+        for site_deployment in site_deployments:
+            site_deployment_deleter(site_deployment.id)
         site.delete() 
diff --git a/planetstack/observer/deleters/site_deployment_deleter.py b/planetstack/observer/deleters/site_deployment_deleter.py
new file mode 100644 (file)
index 0000000..fa97be2
--- /dev/null
@@ -0,0 +1,12 @@
+from core.models import Site, SiteDeployments
+from observer.deleter import Deleter
+
+class SiteDeploymentDeleter(Deleter):
+    model='SiteDeployments'
+
+    def call(self, pk):
+        site_deployment = SiteDeployments.objects.get(pk=pk)
+        if site_deployment.tenant_id:
+            driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
+            driver.delete_tenant(site_deployment.tenant_id)
+        site_deployment.delete()
index 6796d7a..90b58c3 100644 (file)
@@ -1,22 +1,19 @@
-from core.models import Slice
+from core.models import Slice, SliceDeployments, User
 from observer.deleter import Deleter
+from observer.deleters.slice_deployment_deleter import SliceDeploymentDeleter
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
 
 class SliceDeleter(Deleter):
-       model='Slice'
+    model='Slice'
 
-       def call(self, pk):
-               slice = Slice.objects.get(pk=pk)
-        self.driver.delete_router_interface(slice.router_id, slice.subnet_id)
-        self.driver.delete_subnet(slice.subnet_id)
-        self.driver.delete_router(slice.router_id)
-        self.driver.delete_network(slice.network_id)
-        self.driver.delete_tenant(slice.tenant_id)
-        # delete external route
-        subnet = None
-        subnets = self.driver.shell.quantum.list_subnets()['subnets']
-        for snet in subnets:
-            if snet['id'] == slice.subnet_id:
-                subnet = snet
-        if subnet:
-            self.driver.delete_external_route(subnet)
+    def call(self, pk):
+        slice = Slice.objects.get(pk=pk)
+        slice_deployment_deleter = SliceDeploymentDeleter()
+        for slice_deployment in SliceDeployments.objects.filter(slice=slice):
+            try:
+                slice_deployment_deleter(slice_deployment.id)
+            except:
+                logger.log_exc("Failed to delete slice_deployment %s" % slice_deployment) 
         slice.delete()
diff --git a/planetstack/observer/deleters/slice_deployment_deleter.py b/planetstack/observer/deleters/slice_deployment_deleter.py
new file mode 100644 (file)
index 0000000..33e0836
--- /dev/null
@@ -0,0 +1,34 @@
+from core.models import Slice, SliceDeployments, User
+from observer.deleter import Deleter
+from openstack.driver import OpenStackDriver
+
+class SliceDeploymentDeleter(Deleter):
+    model='SliceDeployments'
+
+    def call(self, pk):
+        slice_deployment = SliceDeployments.objects.get(pk=pk)
+        user = User.objects.get(id=slice_deployment.slice.creator.id)
+        driver = OpenStackDriver().admin_driver(deployment=slice_deployment.deployment.name)
+        client_driver = driver.client_driver(caller=user,
+                                             tenant=slice_deployment.slice.name,
+                                             deployment=slice_deployment.deployment.name)
+
+        if slice_deployment.router_id and slice_deployment.subnet_id:
+            client_driver.delete_router_interface(slice_deployment.router_id, slice_deployment.subnet_id)
+        if slice_deployment.subnet_id:
+            client_driver.delete_subnet(slice_deployment.subnet_id)
+        if slice_deployment.router_id:    
+            client_driver.delete_router(slice_deployment.router_id)
+        if slice_deployment.network_id:
+            client_driver.delete_network(slice_deployment.network_id)
+        if slice_deployment.tenant_id:
+            driver.delete_tenant(slice_deployment.tenant_id)
+        # delete external route
+        #subnet = None
+        #subnets = client_driver.shell.quantum.list_subnets()['subnets']
+        #for snet in subnets:
+        #    if snet['id'] == slice_deployment.subnet_id:
+        #        subnet = snet
+        #if subnet:
+        #    driver.delete_external_route(subnet)
+        slice_deployment.delete()
index d76b533..097f0f7 100644 (file)
@@ -1,4 +1,4 @@
-from core.models import Sliver
+from core.models import Sliver, SliceDeployments
 from observer.deleter import Deleter
 
 class SliverDeleter(Deleter):
@@ -7,5 +7,8 @@ class SliverDeleter(Deleter):
     def call(self, pk):
         sliver = Sliver.objects.get(pk=pk)
         if sliver.instance_id:
-            self.driver.destroy_instance(sliver.instance_id)
+            driver = self.driver.client_driver(caller=sliver.creator, 
+                                               tenant=sliver.slice.name,
+                                               deployment=sliver.deploymentNetwork.name)
+            driver.destroy_instance(sliver.instance_id)
         sliver.delete()
index f250993..3573f8d 100644 (file)
@@ -1,11 +1,13 @@
-from core.models import User
+from core.models import User, UserDeployments
 from observer.deleter import Deleter
+from observer.deleters.user_deployment_deleter import UserDeploymentDeleter
 
 class UserDeleter(Deleter):
     model='User'
 
     def call(self, pk):
         user = User.objects.get(pk=pk)
-        if user.kuser_id:
-            self.driver.delete_user(user.kuser_id)
+        user_deployment_deleter = UserDeploymentDeleter()
+        for user_deployment in UserDeployments.objects.filter(user=user):
+            user_deployment_deleter(user_deployment.id)
         user.delete()
diff --git a/planetstack/observer/deleters/user_deployment_deleter.py b/planetstack/observer/deleters/user_deployment_deleter.py
new file mode 100644 (file)
index 0000000..49d349b
--- /dev/null
@@ -0,0 +1,12 @@
+from core.models import User, UserDeployments
+from observer.deleter import Deleter
+
+class UserDeploymentDeleter(Deleter):
+    model='UserDeployment'
+
+    def call(self, pk):
+        user_deployment = UserDeployments.objects.get(pk=pk)
+        if user_deployment.user.kuser_id:
+            driver = self.driver.admin_driver(deployment=user_deployment.deployment.name)
+            driver.delete_user(user_deployment.user.kuser_id)
+        user_deployment.delete()
index bdf5ce3..6c19215 100644 (file)
@@ -16,8 +16,9 @@ from openstack.driver import OpenStackDriver
 from util.logger import Logger, logging, logger
 #from timeout import timeout
 from planetstack.config import Config
-from observer.steps import *
+#from observer.steps import *
 from syncstep import SyncStep
+from toposort import toposort
 
 debug_mode = False
 
@@ -26,52 +27,6 @@ logger = Logger(level=logging.INFO)
 class StepNotReady(Exception):
     pass
 
-def toposort(g, steps=None):
-    if (not steps):
-        keys = set(g.keys())
-        values = set({})
-        for v in g.values():
-            values=values | set(v)
-        
-        steps=list(keys|values)
-    reverse = {}
-
-    for k,v in g.items():
-        for rk in v:
-            try:
-                reverse[rk].append(k)
-            except:
-                reverse[rk]=k
-
-    sources = []
-    for k,v in g.items():
-        if not reverse.has_key(k):
-            sources.append(k)
-
-
-    for k,v in reverse.iteritems():
-        if (not v):
-            sources.append(k)
-
-    order = []
-    marked = []
-
-    while sources:
-        n = sources.pop()
-        try:
-            for m in g[n]:
-                if m not in marked:
-                    sources.append(m)
-                    marked.append(m)
-        except KeyError:
-            pass
-        if (n in steps):
-            order.append(n)
-
-    order.reverse()
-    order.extend(set(steps)-set(order))
-    return order
-
 class NoOpDriver:
     def __init__(self):
          self.enabled = True
@@ -95,6 +50,7 @@ class PlanetStackObserver:
             self.driver = NoOpDriver()
 
     def wait_for_event(self, timeout):
+        logger.info('Waiting for event')
         self.event_cond.acquire()
         self.event_cond.wait(timeout)
         self.event_cond.release()
@@ -166,7 +122,8 @@ class PlanetStackObserver:
                             for dest in provides_dict[m]:
                                 # no deps, pass
                                 try:
-                                    step_graph[source].append(dest)
+                                    if (dest not in step_graph[source]):
+                                        step_graph[source].append(dest)
                                 except:
                                     step_graph[source]=[dest]
                         except KeyError:
@@ -248,73 +205,91 @@ class PlanetStackObserver:
             if (failed_step in step.dependencies):
                 raise StepNotReady
 
-    def run(self):
-        if not self.driver.enabled:
-            return
-        if (self.driver_kind=="openstack") and (not self.driver.has_openstack):
-            return
 
-        while True:
-            try:
-                logger.info('Waiting for event')
-                tBeforeWait = time.time()
-                self.wait_for_event(timeout=30)
-                logger.info('Observer woke up')
+    def run_steps(self):
+        try:
+            logger.info('Observer run steps')
 
-                # Set of whole steps that failed
-                failed_steps = []
+            # Set of whole steps that failed
+            failed_steps = []
 
-                # Set of individual objects within steps that failed
-                failed_step_objects = set()
+            # Set of individual objects within steps that failed
+            failed_step_objects = set()
 
-                for S in self.ordered_steps:
-                    step = self.step_lookup[S]
-                    start_time=time.time()
+            for S in self.ordered_steps:
+                step = self.step_lookup[S]
+                start_time=time.time()
+                
+                sync_step = step(driver=self.driver)
+                sync_step.__name__ = step.__name__
+                sync_step.dependencies = []
+                try:
+                    mlist = sync_step.provides
                     
-                    sync_step = step(driver=self.driver)
-                    sync_step.__name__ = step.__name__
-                    sync_step.dependencies = []
-                    try:
-                        mlist = sync_step.provides
-                        
-                        for m in mlist:
-                            sync_step.dependencies.extend(self.model_dependency_graph[m.__name__])
-                    except KeyError:
-                        pass
-                    sync_step.debug_mode = debug_mode
+                    for m in mlist:
+                        sync_step.dependencies.extend(self.model_dependency_graph[m.__name__])
+                except KeyError:
+                    pass
+                sync_step.debug_mode = debug_mode
 
-                    should_run = False
+                should_run = False
+                try:
+                    # Various checks that decide whether
+                    # this step runs or not
+                    self.check_class_dependency(sync_step, failed_steps) # dont run Slices if Sites failed
+                    self.check_schedule(sync_step) # dont run sync_network_routes if time since last run < 1 hour
+                    should_run = True
+                except StepNotReady:
+                    logger.info('Step not ready: %s'%sync_step.__name__)
+                    failed_steps.append(sync_step)
+                except:
+                    logger.info('Exception when checking schedule: %s'%sync_step.__name__)
+                    failed_steps.append(sync_step)
+
+                if (should_run):
                     try:
-                        # Various checks that decide whether
-                        # this step runs or not
-                        self.check_class_dependency(sync_step, failed_steps) # dont run Slices if Sites failed
-                        self.check_schedule(sync_step) # dont run sync_network_routes if time since last run < 1 hour
-                        should_run = True
-                    except StepNotReady:
-                        logging.info('Step not ready: %s'%sync_step.__name__)
-                        failed_steps.append(sync_step)
+                        duration=time.time() - start_time
+
+                        logger.info('Executing step %s' % sync_step.__name__)
+
+                        # ********* This is the actual sync step
+                        #import pdb
+                        #pdb.set_trace()
+                        failed_objects = sync_step(failed=list(failed_step_objects))
+
+
+                        self.check_duration(sync_step, duration)
+                        if failed_objects:
+                            failed_step_objects.update(failed_objects)
+                        self.update_run_time(sync_step)
                     except:
-                        failed_steps.append(sync_step)
+                        logger.log_exc('Failure in step: %s'%sync_step.__name__)
+                        failed_steps.append(S)
+            self.save_run_times()
+        except:
+            logger.log_exc("Exception in observer run loop")
+            traceback.print_exc()
 
-                    if (should_run):
-                        try:
-                            duration=time.time() - start_time
-
-                            logger.info('Executing step %s' % sync_step.__name__)
-
-                            # ********* This is the actual sync step
-                            #import pdb
-                            #pdb.set_trace()
-                            failed_objects = sync_step(failed=list(failed_step_objects))
-
-
-                            self.check_duration(sync_step, duration)
-                            if failed_objects:
-                                failed_step_objects.update(failed_objects)
-                            self.update_run_time(sync_step)
-                        except:
-                            failed_steps.append(S)
-                self.save_run_times()
-            except:
-                logger.log_exc("Exception in observer run loop")
-                traceback.print_exc()
+    def run(self):
+        try:
+            logger.info('Observer start run loop')
+            if not self.driver.enabled:
+                return
+            if (self.driver_kind=="openstack") and (not self.driver.has_openstack):
+                return
+
+            while True:
+                try:  
+                    self.wait_for_event(timeout=30)       
+                except: 
+                    logger.log_exc("Exception in observer wait for event") 
+                    traceback.print_exc()
+
+                try: 
+                    self.run_steps()            
+                except: 
+                    logger.log_exc("Exception in observer run steps")
+                    traceback.print_exc()
+        except:
+            logger.log_exc("Exception in observer run loop")
+            traceback.print_exc()
index 112564a..bd04ced 100644 (file)
@@ -13,15 +13,39 @@ from fofum import Fofum
 import json
 import traceback
 
-# decorator that marks dispatachable event methods       
+random_client_id=None
+def get_random_client_id():
+    global random_client_id
+
+    if (random_client_id is None) and os.path.exists("/opt/planetstack/random_client_id"):
+        # try to use the last one we used, if we saved it
+        try:
+            random_client_id = open("/opt/planetstack/random_client_id","r").readline().strip()
+            print "get_random_client_id: loaded %s" % random_client_id
+        except:
+            print "get_random_client_id: failed to read /opt/planetstack/random_client_id"
+
+    if random_client_id is None:
+        random_client_id = base64.urlsafe_b64encode(os.urandom(12))
+        print "get_random_client_id: generated new id %s" % random_client_id
+
+        # try to save it for later (XXX: could race with another client here)
+        try:
+            open("/opt/planetstack/random_client_id","w").write("%s\n" % random_client_id)
+        except:
+            print "get_random_client_id: failed to write /opt/planetstack/random_client_id"
+
+    return random_client_id
+
+# decorator that marks dispatachable event methods
 def event(func):
        setattr(func, 'event', func.__name__)
-       return func                     
+       return func
 
 class EventHandler:
        # This code is currently not in use.
        def __init__(self):
-               pass 
+               pass
 
        @staticmethod
        def get_events():
@@ -36,7 +60,7 @@ class EventHandler:
                if hasattr(self, event):
                        return getattr(self, event)(*args, **kwds)
                        
-               
+
 class EventSender:
        def __init__(self,user=None,clientid=None):
                try:
@@ -47,8 +71,8 @@ class EventSender:
                try:
                        clid = Config().feefie_client_id
                except:
-                       clid = self.random_client_id()
-                       
+                       clid = get_random_client_id()
+                        print "EventSender: no feefie_client_id configured. Using random id %s" % clid
 
                self.fofum = Fofum(user=user)
                self.fofum.make(clid)
@@ -116,13 +140,6 @@ class EventListener:
                if (not deletion and self.wake_up):
                        self.wake_up()
 
-       def random_client_id(self):
-               try:
-                       return self.client_id
-               except AttributeError:
-                       self.client_id = base64.urlsafe_b64encode(os.urandom(12))
-                       return self.client_id
-
        def run(self):
                # This is our unique client id, to be used when firing and receiving events
                # It needs to be generated once and placed in the config file
@@ -135,7 +152,8 @@ class EventListener:
                try:
                        clid = Config().feefie_client_id
                except:
-                       clid = self.random_client_id()
+                       clid = get_random_client_id()
+                        print "EventListener: no feefie_client_id configured. Using random id %s" % clid
 
                f = Fofum(user=user)
                
index 926a7dc..2ef6922 100644 (file)
@@ -1,14 +1,16 @@
-from .sync_external_routes import SyncExternalRoutes
+#from .sync_external_routes import SyncExternalRoutes
 from .sync_network_slivers import SyncNetworkSlivers
 from .sync_networks import SyncNetworks
+from .sync_network_deployments import SyncNetworkDeployments
 from .sync_site_privileges import SyncSitePrivileges
 from .sync_sites import SyncSites
 from .sync_slice_memberships import SyncSliceMemberships
 from .sync_slices import SyncSlices
-from .sync_sliver_ips import SyncSliverIps
+#from .sync_sliver_ips import SyncSliverIps
 from .sync_slivers import SyncSlivers
 from .sync_users import SyncUsers
 from .sync_roles import SyncRoles
 from .sync_nodes import SyncNodes
 from .sync_images import SyncImages
+from .sync_image_deployments import SyncImageDeployments
 from .garbage_collector import GarbageCollector
index a13fd22..6feff14 100644 (file)
@@ -6,9 +6,10 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from util.logger import Logger, logging
 from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.deployment import Deployment
 from core.models import *
 
-logger = Logger(level=logging.INFO)
+logger = Logger(logfile='/var/log/observer.log', level=logging.INFO)
 
 class GarbageCollector(OpenStackSyncStep):
     requested_interval = 86400
@@ -16,44 +17,66 @@ class GarbageCollector(OpenStackSyncStep):
 
     def call(self, **args):
         try:
-            #self.gc_roles()
-            self.gc_tenants()
-            self.gc_users()
-            self.gc_user_tenant_roles()
+            self.gc_networks()
+            #self.gc_user_tenant_roles()
+            #self.gc_tenants()
+            #self.gc_users()
             self.gc_slivers()
-            self.gc_sliver_ips()
-            self.gc_external_routes()
+            #self.gc_sliver_ips()
+            pass 
         except:
-            traceback.print_exc() 
+            traceback.print_exc()
 
-    def gc_roles(self):
+    def gc_networks(self):
         """
-         all role that don't already exist in keystone. Remove keystone roles that
-        don't exist in planetstack
-        """
-        # sync all roles that don't already in keystone  
-        keystone_roles = self.driver.shell.keystone.roles.findall()
-        keystone_role_names = [kr.name for kr in keystone_roles]
-        pending_roles = Role.objects.all()
-        pending_role_names = [r.role_type for r in pending_roles] 
-        # don't delete roles for now 
+        Remove all neutron networks that do not exist in the planetstack db.
         """ 
-        # delete keystone roles that don't exist in planetstack
-        for keystone_role in keystone_roles:
-            if keystone_role.name == 'admin':
+        # some networks cannot be deleted
+        system_networks = ['nat-net','private-admin']
+        for network_template in NetworkTemplate.objects.all():
+            if network_template.sharedNetworkName and \
+              network_template.sharedNetworkName not in system_networks:
+                system_networks.append(network_template.sharedNetworkName)
+
+        networks = Network.objects.filter(enacted__isnull=False)
+        networks_dict = {}
+        for network in networks:
+            networks_dict[network.name] = network  
+
+        # some deployments are at the same url. Keep track of the urls we've visited
+        # to make sure we aren't making redundant calls
+        completed_urls = []
+        for deployment in Deployment.objects.all():
+            # skip deployments that we've already processed
+            if deployment.auth_url in completed_urls:
                 continue
-            if keystone_role.name not in pending_role_names:
-                try:
-                    self.driver.delete_role({id: keystone_role.id})
-                except:
-                    traceback.print_exc()
-        """
+            try:
+                driver = self.driver.admin_driver(deployment=deployment)
+                neutron_networks = driver.shell.quantum.list_networks()['networks']
+                for neutron_network in neutron_networks:
+                    # skip system networks
+                    if neutron_network['name'] in system_networks:
+                        continue         
+                    if neutron_network['name'] not in networks_dict:
+                        try:
+                            logger.info("GarbageCollector: deleting network %s" % neutron_network['name'])
+                            for subnet_id in neutron_network['subnets']:
+                                driver.delete_subnet(subnet_id)
+                            driver.delete_network(neutron_network['id'])
+                        except:
+                            logger.log_exc("GarbageCollector: delete network %s failed" % neutron_network['name'])
+            except:
+                logger.log_exc("GarbageCollector: Error at deployment %s" % deployment)
+                                
+            completed_urls.append(deployment.auth_url) 
 
     def gc_tenants(self):
         """
         Remove sites and slices that no don't exist in openstack db if they 
         have an enacted time (enacted != None).
         """ 
+        # some tenants cannot be deleted
+        system_tenants = ['admin','service', 'invisible_to_admin']
         # get all sites that where enacted != null. We can assume these sites
         # have previously been synced and need to be checed for deletion.
         sites = Site.objects.filter(enacted__isnull=False)
@@ -69,24 +92,36 @@ class GarbageCollector(OpenStackSyncStep):
             slice_dict[slice.name] = slice
 
         # delete keystone tenants that don't have a site record
-        tenants = self.driver.shell.keystone.tenants.findall()
-        system_tenants = ['admin','service', 'invisible_to_admin']
-        for tenant in tenants:
-            if tenant.name in system_tenants: 
+        # some deployments are at the same url. Keep track of the urls we've visited
+        # to make sure we aren't making redundant calls
+        completed_urls = []
+        for deployment in Deployment.objects.all():
+            # skip deployments that we've already processed
+            if deployment.auth_url in completed_urls:
                 continue
-            if tenant.name not in site_dict and tenant.name not in slice_dict:
-                try:
-                    self.driver.delete_tenant(tenant.id)
-                    logger.info("deleted tenant: %s" % (tenant))
-                except:
-                    logger.log_exc("delete tenant failed: %s" % tenant)
 
+            driver = self.driver.admin_driver(deployment=deployment)
+            tenants = driver.shell.keystone.tenants.findall()
+            for tenant in tenants:
+                if tenant.name in system_tenants: 
+                    continue
+                if tenant.name not in site_dict and tenant.name not in slice_dict:
+                    try:
+                        logger.info("GarbageCollector: deleting tenant: %s" % (tenant))
+                        driver.delete_tenant(tenant.id)
+                    except:
+                        logger.log_exc("GarbageCollector: delete tenant failed: %s" % tenant)
+            completed_urls.append(deployment.auth_url)
 
     def gc_users(self):
         """
-        Remove users that no don't exist in openstack db if they have an 
+        Remove users that do not exist in openstack db if they have an 
         enacted time (enacted != None).
         """ 
+        # some users cannot be deleted
+        system_users = ['admin', 'nova', 'quantum', 'neutron' 'glance', \
+                        'cinder', 'swift', 'service', 'demo']
+    
         # get all users that where enacted != null. We can assume these users
         # have previously been synced and need to be checed for deletion.
         users = User.objects.filter(enacted__isnull=False)
@@ -95,18 +130,26 @@ class GarbageCollector(OpenStackSyncStep):
             user_dict[user.kuser_id] = user
 
         # delete keystone users that don't have a user record
-        system_users = ['admin', 'nova', 'quantum', 'glance', 'cinder', 'swift', 'service', 'demo']
-        users = self.driver.shell.keystone.users.findall()
-        for user in users:
-            if user.name in system_users:
+        # some deployments are at the same url. Keep track of the urls we've visited
+        # to make sure we aren't making redundant calls
+        completed_urls = []
+        for deployment in Deployment.objects.all():
+            # skip deployments that we've already processed
+            if deployment.auth_url in completed_urls:
                 continue
-            if user.id not in user_dict:
-                try:
-                    self.driver.delete_user(user.id)
-                    logger.info("deleted user: %s" % user)
-                except:
-                    logger.log_exc("delete user failed: %s" % user)
-                    
+
+            driver = self.driver.admin_driver(deployment=deployment)
+            users = driver.shell.keystone.users.findall()
+            for user in users:
+                if user.name in system_users:
+                    continue
+                if user.id not in user_dict:
+                    try:
+                        logger.info("GarbageCollector: deleting user: %s" % user)
+                        self.driver.delete_user(user.id)
+                    except:
+                        logger.log_exc("GarbageCollector: delete user failed: %s" % user)
+            completed_urls.append(deployment.auth_url)          
 
     def gc_user_tenant_roles(self):
         """
@@ -119,46 +162,58 @@ class GarbageCollector(OpenStackSyncStep):
             user_tenant_roles[(site_priv.user.kuser_id, site_priv.site.tenant_id)].append(site_priv.role.role)
         for slice_memb in SlicePrivilege.objects.filter(enacted__isnull=False):
             user_tenant_roles[(slice_memb.user.kuser_id, slice_memb.slice.tenant_id)].append(slice_memb.role.role)  
+
+        # some deployments are at the same url. Keep track of the urls we've visited
+        # to make sure we aren't making redundant calls
+        completed_urls = [] 
         # Some user tenant role aren't stored in planetstack but they must be preserved. 
         # Role that fall in this category are
         # 1. Never remove a user's role that their home site
         # 2. Never remove a user's role at a slice they've created.
         # Keep track of all roles that must be preserved.     
         users = User.objects.all()
-        preserved_roles = {}
-        for user in users:
-            tenant_ids = [s['tenant_id'] for s in user.slices.values()]
-            if user.site:
-                tenant_ids.append(user.site.tenant_id) 
-            preserved_roles[user.kuser_id] = tenant_ids
-
-        # begin removing user tenant roles from keystone. This is stored in the 
-        # Metadata table.
-        for metadata in self.driver.shell.keystone_db.get_metadata():
-            # skip admin roles
-            if metadata.user_id == self.driver.admin_user.id:
+        for deployment in Deployment.objects.all():
+            # skip deployments that we've already processed
+            if deployment.auth_url in completed_urls:
                 continue
-            # skip preserved tenant ids
-            if metadata.user_id in preserved_roles and \
-               metadata.tenant_id in preserved_roles[metadata.user_id]: 
-                continue           
-            # get roles for user at this tenant
-            user_tenant_role_ids = user_tenant_roles.get((metadata.user_id, metadata.tenant_id), [])
-
-            if user_tenant_role_ids:
-                # The user has roles at the tenant. Check if roles need to 
-                # be updated.
-                user_keystone_role_ids = metadata.data.get('roles', [])
-                for role_id in user_keystone_role_ids:
-                    if role_id not in user_tenant_role_ids: 
-                        user_keystone_role_ids.pop(user_keystone_role_ids.index(role_id))
-            else:
-                # The user has no roles at this tenant. 
-                metadata.data['roles'] = [] 
-            #session.add(metadata)
-            logger.info("pruning metadata for %s at %s" % (metadata.user_id, metadata.tenant_id))
+
+            driver = self.driver.admin_driver(deployment=deployment)
+            tenants = driver.shell.keystone.tenants.list() 
+            for user in users:
+                # skip admin roles
+                if user.kuser_id == self.driver.admin_user.id:
+                    continue
+     
+                ignore_tenant_ids = []
+                k_user = driver.shell.keystone.users.find(id=user.kuser_id)
+                ignore_tenant_ids = [s['tenant_id'] for s in user.slices.values()]
+                if user.site:
+                    ignore_tenant_ids.append(user.site.tenant_id) 
+
+                # get user roles in keystone
+                for tenant in tenants:
+                    # skip preserved tenant ids
+                    if tenant.tenant_id in ignore_tenant_ids: 
+                        continue          
+                    # compare user tenant roles
+                    user_tenant_role_ids = user_tenant_roles.get((user.kuser_id, tenant.id), [])
+
+                    if user_tenant_role_ids:
+                        # The user has roles at the tenant. Check if roles need to 
+                        # be updated.
+                        k_user_roles =  driver.shell.keystone.roles.roles_for_user(k_user, tenant)
+                        for k_user_role in k_user_roles:
+                            if k_user_role.role_id not in user_tenant_role_ids: 
+                                logger.info("GarbageCollector: removing user role %s for %s at %s" % \
+                                           (k_user_role, k_user.username, tenant.name))
+                                driver.shell.keyston.remove_user_role(k_user, k_user_role, tenant) 
+                    else:
+                        # remove all roles the user has at the tenant. 
+                        for k_user_role in k_user_roles:
+                            logger.info("GarbageCollector: removing user role %s for %s at %s" % \
+                                       (k_user_role, k_user.username, tenant.name))
+                            driver.shell.keyston.remove_user_role(k_user, k_user_role, tenant)
+            completed_urls.append(deployment.auth_url) 
  
     def gc_slivers(self):
         """
@@ -172,20 +227,33 @@ class GarbageCollector(OpenStackSyncStep):
         for sliver in slivers:
             sliver_dict[sliver.instance_id] = sliver
 
-        # delete sliver that don't have a sliver record
-        ctx = self.driver.shell.nova_db.ctx 
-        instances = self.driver.shell.nova_db.instance_get_all(ctx)
-        for instance in instances:
-            if instance.uuid not in sliver_dict:
-                try:
-                    # lookup tenant and update context  
-                    tenant = self.driver.shell.keystone.tenants.find(id=instance.project_id)
-                    driver = self.driver.client_driver(tenant=tenant.name) 
-                    driver.destroy_instance(instance.uuid)
-                    logger.info("destroyed sliver: %s" % (instance))
-                except:
-                    logger.log_exc("destroy sliver failed: %s" % instance) 
-                
+        
+        # some deployments are at the same url. Keep track of the urls we've visited
+        # to make sure we aren't making redundant calls
+        completed_urls = []
+        for deployment in Deployment.objects.all():
+            # skip deployments that we've already processed
+            if deployment.auth_url in completed_urls:
+                continue
+
+            try:
+                driver = self.driver.admin_driver(deployment=deployment)
+                for tenant in driver.shell.keystone.tenants.list():
+                    if tenant.name in ['admin', 'services']:
+                        continue
+                    # delete sliver that don't have a sliver record
+                    tenant_driver = self.driver.client_driver(tenant=tenant.name, deployment=deployment)
+                    for instance in tenant_driver.shell.nova.servers.list():
+                        if instance.id not in sliver_dict:
+                            try:
+                                logger.info("GarbageCollector: destroying sliver: %s %s" % (instance, instance.id))
+                                tenant_driver.destroy_instance(instance.id)
+                            except:
+                                logger.log_exc("GarbageCollector: destroy sliver failed: %s" % instance)
+            except:
+                logger.log_exc("GarbageCollector: Error at deployment %s" % deployment) 
+            completed_urls.append(deployment.auth_url)
+               
 
     def gc_sliver_ips(self):
         """
@@ -195,7 +263,8 @@ class GarbageCollector(OpenStackSyncStep):
         slivers = Sliver.objects.filter(ip=None)
         for sliver in slivers:
             # update connection
-            driver = self.driver.client_driver(tenant=sliver.slice.name)
+            
+            driver = self.driver.client_driver(tenant=sliver.slice.name, deployment=sliver.node.deployment)
             servers = driver.shell.nova.servers.findall(id=sliver.instance_id)
             if not servers:
                 continue
@@ -206,9 +275,6 @@ class GarbageCollector(OpenStackSyncStep):
                 sliver.save()
                 logger.info("updated sliver ip: %s %s" % (sliver, ips[0]))
 
-    def gc_external_routes(self):
-        pass
-
     def gc_nodes(self):
          # collect local nodes
         nodes = Node.objects.all()
@@ -217,10 +283,12 @@ class GarbageCollector(OpenStackSyncStep):
             nodes_dict[node.name] = node
 
         # collect nova nodes:
-        compute_nodes = self.client.nova.hypervisors.list()
         compute_nodes_dict = {}
-        for compute_node in compute_nodes:
-            compute_nodes_dict[compute_node.hypervisor_hostname] = compute_node
+        for deployment in Deployment.objets.all():
+            driver = self.driver.admin_driver(deployment=deployment) 
+            compute_nodes = driver.nova.hypervisors.list()
+            for compute_node in compute_nodes:
+                compute_nodes_dict[compute_node.hypervisor_hostname] = compute_node
 
         # remove old nodes
         old_node_names = set(nodes_dict.keys()).difference(compute_nodes_dict.keys())
@@ -234,10 +302,12 @@ class GarbageCollector(OpenStackSyncStep):
             images_dict[image.name] = image
 
         # collect glance images
-        glance_images = self.driver.shell.glance.get_images()
         glance_images_dict = {}
-        for glance_image in glance_images:
-            glance_images_dict[glance_image['name']] = glance_image
+        for deployment in Deployment.objects.all():
+            driver = self.driver.admin_driver(deployment=deployment)
+            glance_images = driver.shell.glance.get_images()
+            for glance_image in glance_images:
+                glance_images_dict[glance_image['name']] = glance_image
 
         # remove old images
         old_image_names = set(images_dict.keys()).difference(glance_images_dict.keys())
diff --git a/planetstack/observer/steps/sync_image_deployments.py b/planetstack/observer/steps/sync_image_deployments.py
new file mode 100644 (file)
index 0000000..52aaeef
--- /dev/null
@@ -0,0 +1,71 @@
+import os
+import base64
+from collections import defaultdict
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.deployment import Deployment
+from core.models.image import Image, ImageDeployments
+from util.logger import Logger, logging
+\r
+logger = Logger(level=logging.INFO)
+
+class SyncImageDeployments(OpenStackSyncStep):
+    provides=[ImageDeployments]
+    requested_interval=0
+
+    def fetch_pending(self):
+        # ensure images are available across all deployments
+        image_deployments = ImageDeployments.objects.all()
+        image_deploy_lookup = defaultdict(list)
+        for image_deployment in image_deployments:
+            image_deploy_lookup[image_deployment.image].append(image_deployment.deployment)
+
+        all_deployments = Deployment.objects.all()
+        for image in Image.objects.all():
+            expected_deployments = all_deployments
+            for expected_deployment in expected_deployments:
+                if image not in image_deploy_lookup or \
+                  expected_deployment not in image_deploy_lookup[image]:
+                    id = ImageDeployments(image=image, deployment=expected_deployment)
+                    id.save()
+
+        # now we return all images that need to be enacted
+        return ImageDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
+    def sync_record(self, image_deployment):
+        logger.info("Working on image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+        driver = self.driver.admin_driver(deployment=image_deployment.deployment.name)
+        images = driver.shell.glance.get_images()
+        glance_image = None
+        for image in images:
+            if image['name'] == image_deployment.image.name:
+                glance_image = image
+                break
+        if glance_image:
+            logger.info("Found image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+            image_deployment.glance_image_id = glance_image['id']
+        elif image_deployment.image.path:
+            image = {
+                'name': image_deployment.image.name,
+                'is_public': True,
+                'disk_format': 'raw',
+                'container_format': 'bare',
+                'file': image_deployment.image.path,
+            }
+
+            logger.info("Creating image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+
+            glance_image = driver.shell.glanceclient.images.create(name=image_deployment.image.name,
+                                                                   is_public=True,
+                                                                   disk_format='raw',
+                                                                   container_format='bare')
+            glance_image.update(data=open(image_deployment.image.path, 'rb'))
+
+            # While the images returned by driver.shell.glance.get_images()
+            #   are dicts, the images returned by driver.shell.glanceclient.images.create
+            #   are not dicts. We have to use getattr() instead of [] operator.
+            if not glance_image or not getattr(glance_image,"id",None):
+                raise Exception, "Add image failed at deployment %s" % image_deployment.deployment.name
+            image_deployment.glance_image_id = getattr(glance_image, "id")
+        image_deployment.save()
index 2dbd74d..2c24e83 100644 (file)
@@ -10,20 +10,28 @@ class SyncImages(OpenStackSyncStep):
     requested_interval=0
 
     def fetch_pending(self):
+        # get list of images on disk
+        images_path = Config().observer_images_directory 
+        available_images = {}
+        for f in os.listdir(images_path):
+            if os.path.isfile(os.path.join(images_path ,f)):
+                available_images[f] = os.path.join(images_path ,f)
+
         images = Image.objects.all()
         image_names = [image.name for image in images]
+
+        for image_name in available_images:
+            #remove file extension
+            clean_name = ".".join(image_name.split('.')[:-1])
+            if clean_name not in image_names:
+                image = Image(name=clean_name,
+                              disk_format='raw',
+                              container_format='bare', 
+                              path = available_images[image_name])
+                image.save()
        
-        new_images = []
-        glance_images = self.driver.shell.glance.get_images()
-        for glance_image in glance_images:
-            if glance_image['name'] not in image_names:
-                image = Image(image_id=glance_image['id'],
-                              name=glance_image['name'],
-                              disk_format=glance_image['disk_format'],
-                              container_format=glance_image['container_format'])
-                new_images.append(image)   
-        return new_images
+        
+        return Image.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
 
     def sync_record(self, image):
         image.save()
diff --git a/planetstack/observer/steps/sync_network_deployments.py b/planetstack/observer/steps/sync_network_deployments.py
new file mode 100644 (file)
index 0000000..04f3270
--- /dev/null
@@ -0,0 +1,117 @@
+import os
+import base64
+from collections import defaultdict
+from netaddr import IPAddress, IPNetwork
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.network import *
+from core.models.slice import *
+from core.models.sliver import Sliver
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
+
+class SyncNetworkDeployments(OpenStackSyncStep):
+    requested_interval = 0 
+    provides=[Network, NetworkDeployments, Sliver]
+    
+    def fetch_pending(self):
+        # network deployments are not visible to users. We must ensure
+        # networks are deployed at all deploymets available to their slices. 
+        slice_deployments = SliceDeployments.objects.all()
+        slice_deploy_lookup = defaultdict(list)
+        for slice_deployment in slice_deployments:
+            slice_deploy_lookup[slice_deployment.slice].append(slice_deployment.deployment)
+        
+        network_deployments = NetworkDeployments.objects.all()
+        network_deploy_lookup = defaultdict(list)
+        for network_deployment in network_deployments:
+            network_deploy_lookup[network_deployment.network].append(network_deployment.deployment)
+
+        for network in Network.objects.filter():
+            # ignore networks that have
+            # template.visibility = private and translation = none
+            if network.template.visibility == 'private' and not network.template.translation == 'none':
+                continue                               
+            expected_deployments = slice_deploy_lookup[network.owner]
+            for expected_deployment in expected_deployments:
+                if network not in network_deploy_lookup or \
+                  expected_deployment not in network_deploy_lookup[network]:
+                    nd = NetworkDeployments(network=network, deployment=expected_deployment)
+                    nd.save()
+        return NetworkDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
+    def get_next_subnet(self, deployment=None):
+        # limit ourself to 10.0.x.x for now
+        valid_subnet = lambda net: net.startswith('10.0')
+        driver = self.driver.admin_driver(deployment=deployment)
+        subnets = driver.shell.quantum.list_subnets()['subnets']
+        ints = [int(IPNetwork(subnet['cidr']).ip) for subnet in subnets \
+                if valid_subnet(subnet['cidr'])]
+        ints.sort()
+        if ints:
+            last_ip = IPAddress(ints[-1])
+        else:
+            last_ip = IPAddress('10.0.0.0')
+        last_network = IPNetwork(str(last_ip) + "/24")
+        next_network = IPNetwork(str(IPAddress(last_network) + last_network.size) + "/24")
+        return next_network
+
+    def save_network_deployment(self, network_deployment):
+        if not network_deployment.network_id and network_deployment.network.template.sharedNetworkName:
+            network_deployment.network_id = network_deployment.network.template.sharedNetworkId
+
+        if not network_deployment.net_id:
+            network_name = network_deployment.network.name
+
+            # create network
+            os_network = self.driver.create_network(network_name, shared=True)
+            network_deployment.net_id = os_network['id']
+
+            # create router
+            #router = self.driver.create_router(network_name)
+            #network_deployment.router_id = router['id']
+
+            # create subnet
+            next_subnet = self.get_next_subnet(deployment=network_deployment.deployment.name)
+            cidr = str(next_subnet.cidr)
+            ip_version = next_subnet.version
+            start = str(next_subnet[2])
+            end = str(next_subnet[-2])
+            subnet = self.driver.create_subnet(name=network_name,
+                                               network_id = network_deployment.net_id,
+                                               cidr_ip = cidr,
+                                               ip_version = ip_version,
+                                               start = start,
+                                               end = end)
+            network_deployment.subnet = cidr
+            network_deployment.subnet_id = subnet['id']
+            # add subnet as interface to slice's router
+            #self.driver.add_router_interface(router['id'], subnet['id'])
+            # add external route
+            #self.driver.add_external_route(subnet)
+            logger.info("created private subnet (%s) for network: %s" % (cidr, network_deployment.network))
+        else:
+            (network_deployment.subnet_id, network_deployment.subnet) = self.driver.get_network_subnet(network_deployment.net_id)
+            logger.info("sync'ed subnet (%s) for network: %s" % (network_deployment.subnet, network_deployment.network))
+
+        network_deployment.save()
+
+    def sync_record(self, network_deployment):
+        if network_deployment.network.owner and network_deployment.network.owner.creator:
+            try:
+                # update manager context
+                real_driver = self.driver
+                self.driver = self.driver.client_driver(caller=network_deployment.network.owner.creator, 
+                                                        tenant=network_deployment.network.owner.name,
+                                                        deployment=network_deployment.deployment.name)
+                self.save_network_deployment(network_deployment)
+                self.driver = real_driver
+                logger.info("saved network deployment: %s" % (network_deployment))
+            except Exception,e:
+                logger.log_exc("save network deployment failed: %s" % network_deployment)
+                raise e            
+        
+          
+    
index 09dc7ed..92485a5 100644 (file)
@@ -30,7 +30,8 @@ class SyncNetworkSlivers(OpenStackSyncStep):
         for sliver in slivers:
             slivers_by_instance_id[sliver.instance_id] = sliver
 
-        ports = self.driver.shell.quantum.list_ports()["ports"]
+        driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name, deployment=sliver.node.deployment.name)
+        ports = driver.shell.quantum.list_ports()["ports"]
         for port in ports:
             if port["id"] in networkSlivers_by_port:
                 # we already have it
index cb1d52a..fd42f4e 100644 (file)
@@ -15,55 +15,6 @@ class SyncNetworks(OpenStackSyncStep):
     def fetch_pending(self):
         return Network.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
-    def save_network(self, network):
-        if not network.network_id and network.template.sharedNetworkName:
-                network.network_id = network.template.sharedNetworkId
-
-        if not network.network_id:
-            network_name = network.name
-
-            # create network
-            os_network = self.driver.create_network(network_name, shared=True)
-            network.network_id = os_network['id']
-
-            # create router
-            router = self.driver.create_router(network_name)
-            network.router_id = router['id']
-
-            # create subnet
-            next_subnet = self.get_next_subnet()
-            cidr = str(next_subnet.cidr)
-            ip_version = next_subnet.version
-            start = str(next_subnet[2])
-            end = str(next_subnet[-2])
-            subnet = self.driver.create_subnet(name=network_name,
-                                               network_id = network.network_id,
-                                               cidr_ip = cidr,
-                                               ip_version = ip_version,
-                                               start = start,
-                                               end = end)
-            network.subnet = cidr
-            network.subnet_id = subnet['id']
-            # add subnet as interface to slice's router
-            self.driver.add_router_interface(router['id'], subnet['id'])
-            # add external route
-            self.driver.add_external_route(subnet)
-            logger.info("created private subnet (%s) for network: %s" % (cidr, network))
-        else:
-            (network.subnet_id, network.subnet) = self.driver.get_network_subnet(network.network_id)
-            logger.info("sync'ed subnet (%s) for network: %s" % (network.subnet, network))
-            network.save()
-
     def sync_record(self, network):
-        if network.owner and network.owner.creator:
-            try:
-                # update manager context
-                real_driver = self.driver
-                self.driver = self.driver.client_driver(network.owner.creator, network.owner.name)
-                self.save_network(network)
-                self.driver = real_driver
-                logger.info("saved network: %s" % (network))
-            except Exception,e:
-                logger.log_exc("save network failed: %s" % network)    
-                raise e
+        network.save()
 
index a1f0803..ecd32b4 100644 (file)
@@ -14,28 +14,28 @@ class SyncNodes(OpenStackSyncStep):
     requested_interval=0
 
     def fetch_pending(self):
-        config = Config()
-        deployment = Deployment.objects.filter(name=config.plc_deployment)[0]
-        login_bases = ['princeton', 'stanford', 'gt', 'uw', 'mpisws']
-        sites = Site.objects.filter(login_base__in=login_bases)
-        
         # collect local nodes
+        sites = Site.objects.all()
         nodes = Node.objects.all()
         node_hostnames  = [node.name for node in nodes]
 
-        # collect nova nodes
-        # generate list of new nodes
+        # fetch all nodes from each deployment 
+        deployments = Deployment.objects.all()
         new_nodes = []
-        compute_nodes = self.driver.shell.nova.hypervisors.list()
-        for compute_node in compute_nodes:
-            if compute_node.hypervisor_hostname not in node_hostnames:
-                # pick a random site to add the node to for now
-                site_index = random.randint(0, len(sites))
-                node = Node(name=compute_node.hypervisor_hostname, 
-                            site=sites[site_index], deployment=deployment)
-                new_nodes.append(node) 
-        
-        return new_nodes
+        for deployment in deployments:
+            driver = self.driver.admin_driver(deployment=deployment.name)
+            compute_nodes = driver.shell.nova.hypervisors.list()
+            for compute_node in compute_nodes:
+                if compute_node.hypervisor_hostname not in node_hostnames:
+                    # XX TODO:figure out how to correctly identify a node's site.
+                    # XX pick a random site to add the node to for now
+                    site_index = random.randint(0, len(sites))
+                    node = Node(name=compute_node.hypervisor_hostname,
+                                site=sites[site_index], deployment=deployment)
+                    new_nodes.append(node)
+
+        return new_nodes    
+                 
 
     def sync_record(self, node):
         node.save()
index 18a784a..ca85d57 100644 (file)
@@ -6,7 +6,7 @@ from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.role import Role
 from core.models.site import SiteRole
 from core.models.slice import SliceRole
-from core.models.deployment import DeploymentRole
+from core.models.deployment import Deployment, DeploymentRole
 
 class SyncRoles(OpenStackSyncStep):
     provides=[Role]
@@ -29,12 +29,10 @@ class SyncRoles(OpenStackSyncStep):
 
 
     def sync_record(self, role):
-        save_role = False
-        if not role.krole_id:
-            krole = self.driver.create_role(role.role)
-            role.krole_id = krole.id
-            save_role = True
-
-        if (save_role):
+        if not role.enacted:
+            deployments = Deployment.objects.all()
+                   for deployment in deployments:
+                driver = self.driver.admin_driver(deployment=deployment.name)
+                driver.create_role(role.role)
             role.save()
     
diff --git a/planetstack/observer/steps/sync_site_deployments.py b/planetstack/observer/steps/sync_site_deployments.py
new file mode 100644 (file)
index 0000000..a996c85
--- /dev/null
@@ -0,0 +1,28 @@
+import os
+import base64
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.site import *
+
+class SyncSiteDeployments(OpenStackSyncStep):
+    requested_interval=0
+    provides=[Site, SiteDeployments]
+
+    def fetch_pending(self):
+        return SiteDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
+    def sync_record(self, site_deployment):
+        if not site_deployment.tenant_id:
+            driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
+            tenant = driver.create_tenant(tenant_name=site_deployment.site.login_base,
+                                               description=site_deployment.site.name,
+                                               enabled=site_deployment.site.enabled)
+            site_deployment.tenant_id = tenant.id
+            site_deployment.save()
+        elif site_deployment.site.id and site_deployment.tenant_id:
+            driver = self.driver.admin_driver(deployment=site_deployment.name)
+            driver.update_tenant(site_deployment.tenant_id,
+                                 description=site_deployment.site.name,
+                                 enabled=site_deployment.site.enabled)
+            
index 8287d44..b57ae43 100644 (file)
@@ -4,6 +4,7 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.site import *
+from core.models.user import User, UserDeployments    
 
 class SyncSitePrivileges(OpenStackSyncStep):
     requested_interval=0
@@ -17,3 +18,14 @@ class SyncSitePrivileges(OpenStackSyncStep):
             self.driver.add_user_role(site_priv.user.kuser_id,
                                       site_priv.site.tenant_id,
                                       site_priv.role.role) 
+
+        # sync site privileges at all site deployments
+        site_deployments = SiteDeployments.objects.filter(site=site_priv.site)
+        for site_deployment in site_deployments:
+            user_deployments = UserDeployments.objects.filter(deployment=site_deployment.deployment)
+            if user_deployments:
+                kuser_id  = user_deployments[0].kuser_id
+                driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
+                driver.add_user_role(kuser_id,
+                                     site_deployment.tenant_id,
+                                     site_priv.role.role)
index 2013c6d..e128e9a 100644 (file)
@@ -13,22 +13,5 @@ class SyncSites(OpenStackSyncStep):
         return Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def sync_record(self, site):
-        save_site = False
-        if not site.tenant_id:
-            tenant = self.driver.create_tenant(tenant_name=site.login_base,
-                                               description=site.name,
-                                               enabled=site.enabled)
-            site.tenant_id = tenant.id
-            save_site = True
-            # XXX - What's caller?
-            # self.driver.add_user_role(self.caller.kuser_id, tenant.id, 'admin')
-
-        # update the record
-        if site.id and site.tenant_id:
-            self.driver.update_tenant(site.tenant_id,
-                                      description=site.name,
-                                      enabled=site.enabled)
-
-        if (save_site):
-            site.save() # 
+        site.save()
 
diff --git a/planetstack/observer/steps/sync_slice_deployments.py b/planetstack/observer/steps/sync_slice_deployments.py
new file mode 100644 (file)
index 0000000..b40eb6b
--- /dev/null
@@ -0,0 +1,106 @@
+import os
+import base64
+from collections import defaultdict
+from netaddr import IPAddress, IPNetwork
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.deployment import Deployment
+from core.models.site import SiteDeployments
+from core.models.slice import Slice, SliceDeployments
+from core.models.user import UserDeployments
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
+
+class SyncSliceDeployments(OpenStackSyncStep):
+    provides=[SliceDeployments]
+    requested_interval=0
+
+    def fetch_pending(self):
+        # slice deployments are not visible to users. We must ensure
+        # slices are deployed at all deploymets available to their site.
+        site_deployments = SiteDeployments.objects.all()
+        site_deploy_lookup = defaultdict(list)
+        for site_deployment in site_deployments:
+            site_deploy_lookup[site_deployment.site].append(site_deployment.deployment)
+        
+        slice_deployments = SliceDeployments.objects.all()
+        slice_deploy_lookup = defaultdict(list)
+        for slice_deployment in slice_deployments:
+            slice_deploy_lookup[slice_deployment.slice].append(slice_deployment.deployment)
+        
+        all_deployments = Deployment.objects.all() 
+        for slice in Slice.objects.all():
+            # slices are added to all deployments for now
+            expected_deployments = all_deployments
+            #expected_deployments = site_deploy_lookup[slice.site]
+            for expected_deployment in expected_deployments:
+                if slice not in slice_deploy_lookup or \
+                   expected_deployment not in slice_deploy_lookup[slice]:
+                    sd = SliceDeployments(slice=slice, deployment=expected_deployment)
+                    sd.save()
+
+        # now we can return all slice deployments that need to be enacted   
+        return SliceDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
+    def get_next_subnet(self, deployment=None):
+        # limit ourself to 10.0.x.x for now
+        valid_subnet = lambda net: net.startswith('10.0')
+        driver = self.driver.admin_driver(deployment=deployment)
+        subnets = driver.shell.quantum.list_subnets()['subnets']
+        ints = [int(IPNetwork(subnet['cidr']).ip) for subnet in subnets \
+                if valid_subnet(subnet['cidr'])]
+        ints.sort()
+        if ints:
+            last_ip = IPAddress(ints[-1])
+        else:
+            last_ip = IPAddress('10.0.0.1')
+        last_ip = IPAddress(ints[-1])
+        last_network = IPNetwork(str(last_ip) + "/24")
+        next_network = IPNetwork(str(IPAddress(last_network) + last_network.size) + "/24")
+        return next_network
+
+
+    def sync_record(self, slice_deployment):
+        logger.info("sync'ing slice deployment %s" % slice_deployment)
+        if not slice_deployment.tenant_id:
+            nova_fields = {'tenant_name': slice_deployment.slice.name,
+                   'description': slice_deployment.slice.description,
+                   'enabled': slice_deployment.slice.enabled}
+            driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
+            tenant = driver.create_tenant(**nova_fields)
+            slice_deployment.tenant_id = tenant.id
+
+            # XXX give caller an admin role at the tenant they've created
+            deployment_users = UserDeployments.objects.filter(user=slice_deployment.slice.creator,
+                                                             deployment=slice_deployment.deployment)            
+            if not deployment_users:
+                logger.info("slice createor %s has not accout at deployment %s" % (slice_deployment.slice.creator, slice_deployment.deployment.name))
+            else:
+                deployment_user = deployment_users[0]
+                # lookup user id at this deployment
+                kuser= driver.shell.keystone.users.find(email=slice_deployment.slice.creator.email)
+
+                # add required roles at the slice's tenant 
+                driver.add_user_role(kuser.id, tenant.id, 'admin')
+                    
+                # refresh credentials using this tenant
+                client_driver = self.driver.client_driver(caller=deployment_user.user,
+                                                          tenant=tenant.name, 
+                                                          deployment=slice_deployment.deployment.name)
+
+
+        if slice_deployment.id and slice_deployment.tenant_id:
+            # update existing tenant
+            driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
+            driver.update_tenant(slice_deployment.tenant_id,
+                                 description=slice_deployment.slice.description,
+                                 enabled=slice_deployment.slice.enabled)  
+
+        if slice_deployment.tenant_id:
+            # update slice/tenant quota
+            driver = self.driver.client_driver(deployment=slice_deployment.deployment.name, tenant=slice_deployment.slice.name)
+            driver.shell.nova.quotas.update(tenant_id=slice_deployment.tenant_id, instances=int(slice_deployment.slice.max_slivers)) 
+
+        slice_deployment.save()
index ffc6eb8..38bd26c 100644 (file)
@@ -4,6 +4,10 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.slice import *
+from core.models.user import UserDeployments
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
 
 class SyncSliceMemberships(OpenStackSyncStep):
     requested_interval=0
@@ -13,7 +17,17 @@ class SyncSliceMemberships(OpenStackSyncStep):
         return SlicePrivilege.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def sync_record(self, slice_memb):
-        if slice_memb.user.kuser_id and slice_memb.slice.tenant_id:
-                self.driver.add_user_role(slice_memb.user.kuser_id,
-                                          slice_memb.slice.tenant_id,
-                                          slice_memb.role.role)
+        # sync slice memberships at all slice deployments 
+        logger.info("syncing slice privilege: %s %s" % (slice_memb.slice.name, slice_memb.user.email))
+        slice_deployments = SliceDeployments.objects.filter(slice=slice_memb.slice)
+        for slice_deployment in slice_deployments:
+            if not slice_deployment.tenant_id:
+                continue
+            user_deployments = UserDeployments.objects.filter(deployment=slice_deployment.deployment,
+                                                              user=slice_memb.user)
+            if user_deployments:
+                kuser_id  = user_deployments[0].kuser_id
+                driver = self.driver.admin_driver(deployment=slice_deployment.deployment.name)
+                driver.add_user_role(kuser_id,
+                                     slice_deployment.tenant_id,
+                                     slice_memb.role.role)
index f91c0fc..6cf0772 100644 (file)
@@ -4,7 +4,7 @@ from netaddr import IPAddress, IPNetwork
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.slice import Slice
+from core.models.slice import Slice, SliceDeployments
 from util.logger import Logger, logging
 
 logger = Logger(level=logging.INFO)
@@ -16,63 +16,8 @@ class SyncSlices(OpenStackSyncStep):
     def fetch_pending(self):
         return Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
-    def get_next_subnet(self):
-        # limit ourself to 10.0.x.x for now
-        valid_subnet = lambda net: net.startswith('10.0')
-        subnets = self.driver.shell.quantum.list_subnets()['subnets']
-        ints = [int(IPNetwork(subnet['cidr']).ip) for subnet in subnets \
-                if valid_subnet(subnet['cidr'])]
-        ints.sort()
-        last_ip = IPAddress(ints[-1])
-        last_network = IPNetwork(str(last_ip) + "/24")
-        next_network = IPNetwork(str(IPAddress(last_network) + last_network.size) + "/24")
-        return next_network
-
     def sync_record(self, slice):
-        logger.info("sync'ing slice %s" % slice.name)
-        if not slice.tenant_id:
-            nova_fields = {'tenant_name': slice.name,
-                   'description': slice.description,
-                   'enabled': slice.enabled}
-            tenant = self.driver.create_tenant(**nova_fields)
-            slice.tenant_id = tenant.id
-
-            # XXX give caller an admin role at the tenant they've created
-            self.driver.add_user_role(slice.creator.kuser_id, tenant.id, 'admin')
-
-            # refresh credentials using this tenant
-            client_driver = self.driver.client_driver(tenant=tenant.name)
-
-            # create network
-            network = client_driver.create_network(slice.name)
-            slice.network_id = network['id']
-
-            # create router
-            router = client_driver.create_router(slice.name)
-            slice.router_id = router['id']
-
-            # create subnet for slice's private network
-            next_subnet = self.get_next_subnet()
-            cidr = str(next_subnet.cidr)
-            ip_version = next_subnet.version
-            start = str(next_subnet[2])
-            end = str(next_subnet[-2]) 
-            subnet = client_driver.create_subnet(name=slice.name,
-                                               network_id = network['id'],
-                                               cidr_ip = cidr,
-                                               ip_version = ip_version,
-                                               start = start,
-                                               end = end)
-            slice.subnet_id = subnet['id']
-            # add subnet as interface to slice's router
-            client_driver.add_router_interface(router['id'], subnet['id'])
-            # add external route
-            client_driver.add_external_route(subnet)
-
-
-        if slice.id and slice.tenant_id:
-            self.driver.update_tenant(slice.tenant_id,
-                                      description=slice.description,
-                                      enabled=slice.enabled)   
-
-        slice.save()
+        for slice_deployment in SliceDeployments.objects.filter(slice=slice):
+            # bump the 'updated' timestamp and trigger observer to update
+            # slice across all deployments 
+            slice_deployment.save()    
index 2d7f1f8..e2212d1 100644 (file)
@@ -14,7 +14,8 @@ class SyncSliverIps(OpenStackSyncStep):
         return slivers
 
     def sync_record(self, sliver):
-        driver = self.driver.client_driver(tenant=sliver.slice.name)  
+        driver = self.driver.client_driver(tenant=sliver.slice.name, 
+                                           deployment=sliver.node.deployment.name)  
         servers = driver.shell.nova.servers.findall(id=sliver.instance_id)
         if not servers:
             return
@@ -23,5 +24,6 @@ class SyncSliverIps(OpenStackSyncStep):
         if not ips:
             return
         sliver.ip = ips[0]['addr']
-        sliver.save()
-        logger.info("saved sliver ip: %s %s" % (sliver, ips[0]))
+        if sliver.ip:
+            sliver.save()
+            logger.info("saved sliver ip: %s %s" % (sliver, ips[0]))
index a3f423c..3b81766 100644 (file)
@@ -4,7 +4,11 @@ from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.sliver import Sliver
-from core.models.slice import SlicePrivilege
+from core.models.slice import Slice, SlicePrivilege, SliceDeployments
+from core.models.network import Network, NetworkSlice, NetworkDeployments
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
 
 class SyncSlivers(OpenStackSyncStep):
     provides=[Sliver]
@@ -13,19 +17,8 @@ class SyncSlivers(OpenStackSyncStep):
     def fetch_pending(self):
         return Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
-    def get_requested_networks(self, slice):
-        network_ids = [x.network_id for x in slice.networks.all()]
-
-        if slice.network_id is not None:
-            network_ids.append(slice.network_id)
-
-        networks = []
-        for network_id in network_ids:
-            networks.append({"net-id": network_id})
-
-        return networks
-
     def sync_record(self, sliver):
+        logger.info("sync'ing sliver:%s deployment:%s " % (sliver, sliver.node.deployment))
         metadata_update = {}
         if ("numberCores" in sliver.changed_fields):
             metadata_update["cpu_cores"] = str(sliver.numberCores)
@@ -35,22 +28,64 @@ class SyncSlivers(OpenStackSyncStep):
                 metadata_update[tag.name] = tag.value
 
         if not sliver.instance_id:
-            nics = self.get_requested_networks(sliver.slice)
-            file("/tmp/scott-manager","a").write("slice: %s\nreq: %s\n" % (str(sliver.slice.name), str(nics)))
+            driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name, deployment=sliver.deploymentNetwork.name)
+            # public keys
             slice_memberships = SlicePrivilege.objects.filter(slice=sliver.slice)
             pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
-            pubkeys.append(sliver.creator.public_key)
-            driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name)
+            if sliver.creator.public_key:
+                pubkeys.append(sliver.creator.public_key)
+            if sliver.slice.creator.public_key:
+                pubkeys.append(sliver.slice.creator.public_key) 
+            # netowrks
+            # include all networks available to the slice and/or associated network templates
+            nics = []
+            networks = [ns.network for ns in NetworkSlice.objects.filter(slice=sliver.slice)]   
+            network_deployments = NetworkDeployments.objects.filter(network__in=networks, 
+                                                                    deployment=sliver.node.deployment)
+            # Gather private networks first. This includes networks with a template that has
+            # visibility = private and translation = none
+            for network_deployment in network_deployments:
+                if network_deployment.network.template.visibility == 'private' and \
+                   network_deployment.network.template.translation == 'none': 
+                    nics.append({'net-id': network_deployment.net_id})
+    
+            # now include network template
+            network_templates = [network.template.sharedNetworkName for network in networks \
+                                 if network.template.sharedNetworkName]
+            #logger.info("%s %s %s %s" % (driver.shell.quantum.username, driver.shell.quantum.password, driver.shell.quantum.tenant, driver.shell.quantum.url))
+            for net in driver.shell.quantum.list_networks()['networks']:
+                if net['name'] in network_templates: 
+                    nics.append({'net-id': net['id']}) 
+
+            # look up image id
+            deployment_driver = self.driver.admin_driver(deployment=sliver.deploymentNetwork.name)
+            image_id = None
+            images = deployment_driver.shell.glance.get_images()
+            for image in images:
+                if image['name'] == sliver.image.name:
+                    image_id = image['id']
+                    
+            # look up key name at the deployment
+            # create/fetch keypair
+            keyname = None
+            if sliver.creator.public_key:
+                keyname = sliver.creator.email.lower().replace('@', 'AT').replace('.', '') +\
+                          sliver.slice.name
+                key_fields =  {'name': keyname,
+                               'public_key': sliver.creator.public_key}
+                driver.create_keypair(**key_fields)
+
             instance = driver.spawn_instance(name=sliver.name,
-                                key_name = sliver.creator.keyname,
-                                image_id = sliver.image.image_id,
+                                key_name = keyname,
+                                image_id = image_id,
                                 hostname = sliver.node.name,
                                 pubkeys = pubkeys,
-                                nics = nics )
+                                nics = nics,
+                                userdata = sliver.userData )
             sliver.instance_id = instance.id
             sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
+            sliver.save()    
 
         if sliver.instance_id and metadata_update:
-            self.driver.update_instance_metadata(sliver.instance_id, metadata_update)
+            driver.update_instance_metadata(sliver.instance_id, metadata_update)
 
-        sliver.save()    
diff --git a/planetstack/observer/steps/sync_user_deployments.py b/planetstack/observer/steps/sync_user_deployments.py
new file mode 100644 (file)
index 0000000..39943f7
--- /dev/null
@@ -0,0 +1,98 @@
+import os
+import base64
+import hashlib
+from collections import defaultdict
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.site import SiteDeployments, Deployment
+from core.models.user import User, UserDeployments
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
+
+class SyncUserDeployments(OpenStackSyncStep):
+    provides=[User, UserDeployments]
+    requested_interval=0
+
+    def fetch_pending(self):
+        # user deployments are not visible to users. We must ensure
+        # user are deployed at all deploymets available to their sites.
+
+        deployments = Deployment.objects.all()
+        site_deployments = SiteDeployments.objects.all()
+        site_deploy_lookup = defaultdict(list)
+        for site_deployment in site_deployments:
+            site_deploy_lookup[site_deployment.site].append(site_deployment.deployment)
+
+        user_deploy_lookup = defaultdict(list)
+        for user_deployment in UserDeployments.objects.all():
+            user_deploy_lookup[user_deployment.user].append(user_deployment.deployment)
+       
+        all_deployments = Deployment.objects.filter() 
+        for user in User.objects.all():
+            if user.is_admin:
+                # admins should have an account at all deployments
+                expected_deployments = deployments
+            else:
+                # normal users should have an account at their site's deployments
+                #expected_deployments = site_deploy_lookup[user.site]
+                # users are added to all deployments for now
+                expected_deployments = deployments        
+            for expected_deployment in expected_deployments:
+                if not user in user_deploy_lookup or \
+                  expected_deployment not in user_deploy_lookup[user]: 
+                    # add new record
+                    ud = UserDeployments(user=user, deployment=expected_deployment)
+                    ud.save()
+                    #user_deployments.append(ud)
+                #else:
+                #    # update existing record
+                #    ud = UserDeployments.objects.get(user=user, deployment=expected_deployment)
+                #    user_deployments.append(ud)
+
+        return UserDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
+
+    def sync_record(self, user_deployment):
+        logger.info("sync'ing user %s at deployment %s" % (user_deployment.user, user_deployment.deployment.name))
+        name = user_deployment.user.email[:user_deployment.user.email.find('@')]
+        user_fields = {'name': user_deployment.user.email,
+                       'email': user_deployment.user.email,
+                       'password': hashlib.md5(user_deployment.user.password).hexdigest()[:6],
+                       'enabled': True}    
+        driver = self.driver.admin_driver(deployment=user_deployment.deployment.name)
+        if not user_deployment.kuser_id:
+            keystone_user = driver.create_user(**user_fields)
+            user_deployment.kuser_id = keystone_user.id
+        else:
+            driver.update_user(user_deployment.kuser_id, user_fields)
+
+        # setup user deployment home site roles  
+        if user_deployment.user.site:
+            site_deployments = SiteDeployments.objects.filter(site=user_deployment.user.site,
+                                                              deployment=user_deployment.deployment)
+            if site_deployments:
+                # need the correct tenant id for site at the deployment
+                tenant_id = site_deployments[0].tenant_id  
+                driver.add_user_role(user_deployment.kuser_id, 
+                                     tenant_id, 'user')
+                if user_deployment.user.is_admin:
+                    driver.add_user_role(user_deployment.kuser_id, tenant_id, 'admin')
+                else:
+                    # may have admin role so attempt to remove it
+                    driver.delete_user_role(user_deployment.kuser_id, tenant_id, 'admin')
+
+        #if user_deployment.user.public_key:
+        #    if not user_deployment.user.keyname:
+        #        keyname = user_deployment.user.email.lower().replace('@', 'AT').replace('.', '')
+        #        user_deployment.user.keyname = keyname
+        #        user_deployment.user.save()
+        #    
+        #    user_driver = driver.client_driver(caller=user_deployment.user, 
+        #                                       tenant=user_deployment.user.site.login_base, 
+        #                                       deployment=user_deployment.deployment.name)
+        #    key_fields =  {'name': user_deployment.user.keyname,
+        #                   'public_key': user_deployment.user.public_key}
+        #    user_driver.create_keypair(**key_fields)
+
+        user_deployment.save()
index 25f093e..71f9c0f 100644 (file)
@@ -4,7 +4,7 @@ import hashlib
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.user import User
+from core.models.user import User, UserDeployments
 
 class SyncUsers(OpenStackSyncStep):
     provides=[User]
@@ -14,29 +14,7 @@ class SyncUsers(OpenStackSyncStep):
         return User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def sync_record(self, user):
-        name = user.email[:user.email.find('@')]
-        user_fields = {'name': name,
-                       'email': user.email,
-                       'password': hashlib.md5(user.password).hexdigest()[:6],
-                       'enabled': True}
-        if not user.kuser_id:
-            keystone_user = self.driver.create_user(**user_fields)
-            user.kuser_id = keystone_user.id
-        else:
-            self.driver.update_user(user.kuser_id, user_fields)        
-
-        if user.site:
-            self.driver.add_user_role(user.kuser_id, user.site.tenant_id, 'user')
-            if user.is_admin:
-                self.driver.add_user_role(user.kuser_id, user.site.tenant_id, 'admin')
-            else:
-                # may have admin role so attempt to remove it
-                self.driver.delete_user_role(user.kuser_id, user.site.tenant_id, 'admin')
-
-        if user.public_key:
-            driver = self.driver.client_driver(caller=user, tenant=user.site.login_base) 
-            key_fields =  {'name': user.keyname,
-                           'public_key': user.public_key}
-            driver.create_keypair(**key_fields)
-
-        user.save()
+        for user_deployment in UserDeployments.objects.filter(user=user):
+            # bump the 'updated' field so user account are updated across 
+            # deployments.
+            user_deployment.save()
index fb8c77a..c41628a 100644 (file)
@@ -46,7 +46,8 @@ class SyncStep:
     
     def check_dependencies(self, obj, failed):
         for dep in self.dependencies:
-            peer_object = getattr(obj, dep.lower())
+            peer_name = dep[0].lower() + dep[1:]    # django names are camelCased with the first letter lower
+            peer_object = getattr(obj, peer_name)
             if (peer_object.pk==failed.pk):
                 raise FailedDependency
 
@@ -60,7 +61,7 @@ class SyncStep:
                 o.enacted = datetime.now() # Is this the same timezone? XXX
                 o.save(update_fields=['enacted'])
             except:
-                logger.log_exc("sync step failed!")
+                logger.log_exc("sync step %s failed!" % self.__name__)
                 failed.append(o)
 
         return failed
old mode 100755 (executable)
new mode 100644 (file)
index 959cea3..a2c9389
@@ -5,58 +5,69 @@ import traceback
 import commands
 import threading
 import json
+import pdb
 
 from datetime import datetime
 from collections import defaultdict
 
+# Topological sort
+# Notes:
+# - Uses a stack instead of recursion
+# - Forfeits optimization involving tracking currently visited nodes
 def toposort(g, steps=None):
+       # Get set of all nodes, including those without outgoing edges
+       keys = set(g.keys())
+       values = set({})
+       for v in g.values():
+               values=values | set(v)
+       
+       all_nodes=list(keys|values)
        if (not steps):
-               keys = set(g.keys())
-               values = set({})
-               for v in g.values():
-                       values=values | set(v)
-               
-               steps=list(keys|values)
+               steps = all_nodes
 
-       reverse = {}
+       # Final order
+       order = []
+
+       # DFS stack, not using recursion
+       stack = []
+
+       # Unmarked set
+       unmarked = all_nodes
 
-       for k,v in g.items():
-               for rk in v:
+       # visiting = [] - skip, don't expect 1000s of nodes, |E|/|V| is small
+
+       while unmarked:
+               stack.insert(0,unmarked[0]) # push first unmarked
+
+               while (stack):
+                       n = stack[0]
+                       add = True
                        try:
-                               reverse[rk].append(k)
-                       except:
-                               reverse[rk]=k
+                               for m in g[n]:
+                                       if (m in unmarked):
+                                               if (m not in stack):
+                                                       add = False
+                                                       stack.insert(0,m)
+                                               else:
+                                                       # Should not happen, if so there's a loop
+                                                       print 'Loop at %s'%m
+                       except KeyError:
+                               pass
+                       if (add):
+                               if (n in steps):
+                                       order.append(n)
+                               item = stack.pop(0)
+                               unmarked.remove(item)
 
-       sources = []
-       for k,v in g.items():
-               if not reverse.has_key(k):
-                       sources.append(k)
+       noorder = list(set(steps) - set(order))
+       return order + noorder
 
-       for k,v in reverse.iteritems():
-               if (not v):
-                       sources.append(k)
+def main():
+       graph_file=open('planetstack.deps').read()
+       g = json.loads(graph_file)
+       print toposort(g)
 
-       order = []
-       marked = []
-
-       while sources:
-               n = sources.pop(0)
-               try:
-                       for m in g[n]:
-                               if m not in marked:
-                                       sources.append(m)
-                                       marked.append(m)
-               except KeyError:
-                       pass
-               if (n in steps):
-                       order.append(n)
-
-       order.reverse()
-
-       return order
-
-graph_file=open('model-deps').read()
-g = json.loads(graph_file)
-print toposort(g)
+if (__name__=='__main__'):
+       main()
 
 #print toposort({'a':'b','b':'c','c':'d','d':'c'},['d','c','b','a'])
index 1a6386d..162e506 100644 (file)
@@ -1,6 +1,8 @@
+import urlparse
 try:
     from keystoneclient.v2_0 import client as keystone_client
     from glance import client as glance_client
+    import glanceclient
     from novaclient.v1_1 import client as nova_client
     from quantumclient.v2_0 import client as quantum_client
     from nova.db.sqlalchemy import api as nova_db_api 
@@ -39,16 +41,18 @@ def parse_novarc(filename):
     return opts
 
 class Client:
-    def __init__(self, username=None, password=None, tenant=None, url=None, config=None, *args, **kwds):
-        if config:
-            config = Config(config)
-        else:
-            config = Config()
+    def __init__(self, username=None, password=None, tenant=None, url=None, token=None, endpoint=None, deployment=None, admin=True, *args, **kwds):
+        
         self.has_openstack = has_openstack
-        self.username = config.nova_admin_user
-        self.password = config.nova_admin_password
-        self.tenant = config.nova_admin_tenant
-        self.url = config.nova_url
+        self.url = deployment.auth_url
+        if admin:
+            self.username = deployment.admin_user
+            self.password = deployment.admin_password
+            self.tenant = deployment.admin_tenant
+        else:
+            self.username = None
+            self.password = None
+            self.tenant = None
 
         if username:
             self.username = username
@@ -58,9 +62,13 @@ class Client:
             self.tenant = tenant
         if url:
             self.url = url
+        if token:
+            self.token = token    
+        if endpoint:
+            self.endpoint = endpoint
 
-        if '@' in self.username:
-            self.username = self.username[:self.username.index('@')]
+        #if '@' in self.username:
+        #    self.username = self.username[:self.username.index('@')]
 
 class KeystoneDB:
     @require_enabled
@@ -80,7 +88,8 @@ class KeystoneClient(Client):
             self.client = keystone_client.Client(username=self.username,
                                                  password=self.password,
                                                  tenant_name=self.tenant,
-                                                 auth_url=self.url)
+                                                 auth_url=self.url
+                                                )
 
     @require_enabled
     def connect(self, *args, **kwds):
@@ -104,6 +113,16 @@ class GlanceClient(Client):
     def __getattr__(self, name):
         return getattr(self.client, name)
 
+class GlanceClientNew(Client):
+    def __init__(self, version, endpoint, token, *args, **kwds):
+        Client.__init__(self, *args, **kwds)
+        if has_openstack:
+            self.client = glanceclient.Client(version, endpoint=endpoint, token=token)
+
+    @require_enabled
+    def __getattr__(self, name):
+        return getattr(self.client, name)        
+
 class NovaClient(Client):
     def __init__(self, *args, **kwds):
         Client.__init__(self, *args, **kwds)
@@ -168,11 +187,17 @@ class OpenStackClient:
     def __init__ ( self, *args, **kwds) :
         # instantiate managers
         self.keystone = KeystoneClient(*args, **kwds)
+        url_parsed = urlparse.urlparse(self.keystone.url)
+        hostname = url_parsed.netloc.split(':')[0]
+        token = self.keystone.client.tokens.authenticate(username=self.keystone.username, password=self.keystone.password, tenant_name=self.keystone.tenant)
         self.keystone_db = KeystoneDB()
         self.glance = GlanceClient(*args, **kwds)
+        
+        self.glanceclient = GlanceClientNew('1', endpoint='http://%s:9292' % hostname, token=token.id)
         self.nova = NovaClient(*args, **kwds)
         self.nova_db = NovaDB(*args, **kwds)
         self.quantum = QuantumClient(*args, **kwds)
+    
 
     @require_enabled
     def connect(self, *args, **kwds):
index 8224c17..8ebea68 100644 (file)
@@ -12,44 +12,48 @@ manager_enabled = Config().api_nova_enabled
 
 class OpenStackDriver:
 
-    def __init__(self, config = None, client=None): 
+    def __init__(self, config = None, client=None, deployment=None):
         if config:
             self.config = Config(config)
         else:
-            self.config = Config() 
+            self.config = Config()
 
-        self.admin_client = OpenStackClient()
+        self.admin_client = OpenStackClient(deployment=deployment)
         self.admin_user = self.admin_client.keystone.users.find(name=self.admin_client.keystone.username)
 
         if client:
             self.shell = client
         else:
-            self.shell = OpenStackClient()
+            self.shell = OpenStackClient(deployment=deployment)
 
         self.enabled = manager_enabled
         self.has_openstack = has_openstack
 
-    def client_driver(self, caller=None, tenant=None):
+    def client_driver(self, caller=None, tenant=None, deployment=None):
         if caller:
             auth = {'username': caller.email,
                     'password': hashlib.md5(caller.password).hexdigest()[:6],
                     'tenant': tenant}
-            client = OpenStackClient(**auth)
+            client = OpenStackClient(deployment=deployment, **auth)
         else:
-            client = OpenStackClient(tenant=tenant)
-        driver = OpenStackDriver(client=client)
+            client = OpenStackClient(tenant=tenant, deployment=deployment)
+
+        driver = OpenStackDriver(client=client, deployment=deployment)
         return driver
 
-    def admin_driver(self, tenant=None):
-        client = OpenStackClient(tenant=tenant)
-        driver = OpenStackDriver(client=client) 
+    def admin_driver(self, tenant=None, deployment=None):
+        client = OpenStackClient(tenant=tenant, deployment=deployment)
+        driver = OpenStackDriver(client=client, deployment=deployment)
+        return driver    
 
     def create_role(self, name):
         roles = self.shell.keystone.roles.findall(name=name)
-        if not roles:
+        roles_title = self.shell.keystone.roles.findall(name=name.title())
+        roles_found = roles + roles_title
+        if not roles_found:
             role = self.shell.keystone.roles.create(name)
         else:
-            role = roles[0]
+            role = roles_found[0]
         return role
 
     def delete_role(self, filter):
@@ -109,12 +113,27 @@ class OpenStackDriver:
             for key in keys:
                 self.shell.nova.keypairs.delete(key)
             self.shell.keystone.users.delete(user)
-        return 1 
+        return 1
+
+    def get_admin_role(self):
+        role = None
+        for admin_role_name in ['admin', 'Admin']:
+            roles = self.shell.keystone.roles.findall(name=admin_role_name)
+            if roles:
+                role = roles[0]
+                break
+        return role 
 
     def add_user_role(self, kuser_id, tenant_id, role_name):
         user = self.shell.keystone.users.find(id=kuser_id)
         tenant = self.shell.keystone.tenants.find(id=tenant_id)
-        role = self.shell.keystone.roles.find(name=role_name)
+        # admin role can be lowercase or title. Look for both
+        role = None
+        if role_name.lower() == 'admin':
+            role = self.get_admin_role()
+        else:
+            # look up non admin role or force exception when admin role isnt found 
+            role = self.shell.keystone.roles.find(name=role_name)                   
 
         role_found = False
         user_roles = user.list_roles(tenant.id)
@@ -129,7 +148,13 @@ class OpenStackDriver:
     def delete_user_role(self, kuser_id, tenant_id, role_name):
         user = self.shell.keystone.users.find(id=kuser_id)
         tenant = self.shell.keystone.tenants.find(id=tenant_id)
-        role = self.shell.keystone.roles.find(name=role_name)
+        # admin role can be lowercase or title. Look for both
+        role = None
+        if role_name.lower() == 'admin':
+            role = self.get_admin_role()
+        else:
+            # look up non admin role or force exception when admin role isnt found
+            role = self.shell.keystone.roles.find(name=role_name)
 
         role_found = False
         user_roles = user.list_roles(tenant.id)
@@ -238,17 +263,21 @@ class OpenStackDriver:
                 subnet = snet
 
         if not subnet:
+            # HACK: Add metadata route -- Neutron does not reliably supply this
+            metadata_ip = cidr_ip.replace("0/24", "3")
+
             allocation_pools = [{'start': start, 'end': end}]
             subnet = {'subnet': {'name': name,
                                  'network_id': network_id,
                                  'ip_version': ip_version,
                                  'cidr': cidr_ip,
-                                 'dns_nameservers': ['8.8.8.8', '8.8.4.4'],
+                                 #'dns_nameservers': ['8.8.8.8', '8.8.4.4'],
+                                 'host_routes': [{'destination':'169.254.169.254/32','nexthop':metadata_ip}],
+                                 'gateway_ip': None,
                                  'allocation_pools': allocation_pools}}
             subnet = self.shell.quantum.create_subnet(subnet)['subnet']
-            self.add_external_route(subnet)
-        # TODO: Add route to external network
-        # e.g. #  route add -net 10.0.3.0/24 dev br-ex gw 10.100.0.5 
+            # self.add_external_route(subnet)
+
         return subnet
 
     def update_subnet(self, id, fields):
@@ -384,7 +413,7 @@ class OpenStackDriver:
 
         return (subnet_id, subnet)
 
-    def spawn_instance(self, name, key_name=None, hostname=None, image_id=None, security_group=None, pubkeys=[], nics=None, metadata=None):
+    def spawn_instance(self, name, key_name=None, hostname=None, image_id=None, security_group=None, pubkeys=[], nics=None, metadata=None, userdata=None):
         flavor_name = self.config.nova_default_flavor
         flavor = self.shell.nova.flavors.find(name=flavor_name)
         #if not image:
@@ -393,24 +422,25 @@ class OpenStackDriver:
             security_group = self.config.nova_default_security_group
 
         files = {}
-        if pubkeys:
-            files['/root/.ssh/authorized_keys'] = "\n".join(pubkeys)
-
+        #if pubkeys:
+        #    files["/root/.ssh/authorized_keys"] = "\n".join(pubkeys).encode('base64')
         hints = {}
         availability_zone = None
         if hostname:
-            availability_zone = 'nova:%s' % hostname
+            availability_zone = 'nova:%s' % hostname.split('.')[0]
         server = self.shell.nova.servers.create(
                                             name=name,
                                             key_name = key_name,
                                             flavor=flavor.id,
                                             image=image_id,
                                             security_group = security_group,
-                                            files=files,
+                                            #files = files,
                                             scheduler_hints=hints,
                                             availability_zone=availability_zone,
                                             nics=nics,
-                                            meta=metadata)
+                                            networks=nics,
+                                            meta=metadata,
+                                            userdata=userdata)
         return server
 
     def destroy_instance(self, id):
index 7d94b67..596ecdd 100755 (executable)
@@ -1,10 +1,45 @@
 #!/usr/bin/env python
 import os
+import argparse
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
-from observer.backend import Backend 
+from observer.backend import Backend
+from planetstack.config import Config 
 
-if __name__ == '__main__':
+config = Config()
+
+# after http://www.erlenstar.demon.co.uk/unix/faq_2.html
+def daemon():
+    """Daemonize the current process."""
+    if os.fork() != 0: os._exit(0)
+    os.setsid()
+    if os.fork() != 0: os._exit(0)
+    os.umask(0)
+    devnull = os.open(os.devnull, os.O_RDWR)
+    os.dup2(devnull, 0)
+    # xxx fixme - this is just to make sure that nothing gets stupidly lost - should use devnull
+    logdir=os.path.dirname(config.observer_logfile)
+    # when installed in standalone we might not have httpd installed
+    if not os.path.isdir(logdir): os.mkdir(logdir)
+    crashlog = os.open('%s'%config.observer_logfile, os.O_RDWR | os.O_APPEND | os.O_CREAT, 0644)
+    os.dup2(crashlog, 1)
+    os.dup2(crashlog, 2)
+
+def main():
+    # Generate command line parser
+    parser = argparse.ArgumentParser(usage='%(prog)s [options]')
+    parser.add_argument('-d', '--daemon', dest='daemon', action='store_true', default=False, 
+                        help='Run as daemon.')
+    # smbaker: util/config.py parses sys.argv[] directly to get config file name; include the option here to avoid
+    #   throwing unrecognized argument exceptions
+    parser.add_argument('-C', '--config', dest='config_file', action='store', default="/opt/planetstack/plstackapi_config",
+                        help='Name of config file.')
+    args = parser.parse_args()
+       
+    if args.daemon: daemon()
 
     backend = Backend()
-    backend.run()
+    backend.run()    
+
+if __name__ == '__main__':
+    
+    main() 
diff --git a/planetstack/planetstack-config.py b/planetstack/planetstack-config.py
new file mode 100755 (executable)
index 0000000..7aa375b
--- /dev/null
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+import sys
+from planetstack.config import Config
+
+def help():
+    print "syntax: %s get name [default]" % sys.argv[0]
+
+def main():
+    c = Config()
+
+    if len(sys.argv)<=1:
+        help()
+        return
+
+    if sys.argv[1] == "get":
+        if len(sys.argv)==4:
+            print getattr(c, sys.argv[2], sys.argv[3])
+        elif len(sys.argv)==3:
+            print getattr(c, sys.argv[2])
+        else:
+            help()
+    else:
+        help()
+
+main()
index c8da725..1f01e96 100644 (file)
@@ -4,6 +4,8 @@ from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP
 from config import Config
 config = Config()
 
+GEOIP_PATH = "/usr/share/GeoIP"
 DEBUG = True
 TEMPLATE_DEBUG = DEBUG
 
@@ -59,12 +61,12 @@ USE_TZ = True
 
 # Absolute filesystem path to the directory that will hold user-uploaded files.
 # Example: "/var/www/example.com/media/"
-MEDIA_ROOT = ''
+MEDIA_ROOT = '/var/www/html/files/'
 
 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
 # trailing slash.
 # Examples: "http://example.com/media/", "http://media.example.com/"
-MEDIA_URL = ''
+MEDIA_URL = '/files/'
 
 # Absolute path to the directory static files should be collected to.
 # Don't put anything in this directory yourself; store your static files
@@ -141,6 +143,9 @@ INSTALLED_APPS = (
     'core',
     'hpc',
     'requestrouter',
+    'cassandra',
+    'kairos',
+    'nagios',
     'syndicate',
     'geoposition',
 )
@@ -149,6 +154,7 @@ INSTALLED_APPS = (
 # Added for django-suit form 
 TEMPLATE_CONTEXT_PROCESSORS = TCP + (
     'django.core.context_processors.request',
+    'core.context_processors.planetstack',
 )
 
 # Django Suit configuration example
@@ -195,9 +201,13 @@ SUIT_CONFIG = {
         {'label': 'Sites', 'icon':'icon-site', 'url': '/admin/core/site/'},
         {'label': 'Slices', 'icon':'icon-slice', 'url': '/admin/core/slice/'},
         {'label': 'Users', 'icon':'icon-user', 'url': '/admin/core/user/'},
-        {'label': 'Request Routing', 'icon':'icon-cog', 'app': 'requestrouter'},
+        {'label': 'RequestRouter', 'icon':'icon-cog', 'app': 'requestrouter'},
         {'label': 'HyperCache', 'icon':'icon-cog', 'app': 'hpc'},
         {'label': 'Syndicate', 'icon':'icon-cog', 'app': 'syndicate'},
+        {'label': 'Cassandra', 'icon':'icon-cog', 'app': 'cassandra'},
+#        {'label': 'KairosDB', 'icon':'icon-cog', 'app': 'kairos'},
+#        {'label': 'Nagios', 'icon':'icon-cog', 'app': 'nagios'},
+
         #{'label': 'Configured Services', 'icon':'icon-cog', 'models': [{'label': 'Content Delivery Network', 'app':'hpc'}]},
     #     'sites',
     #     {'app': 'auth', 'icon':'icon-lock', 'models': ('user', 'group')},
@@ -238,3 +248,7 @@ LOGGING = {
         },
     }
 }
+
+BIGQUERY_TABLE = getattr(config, "bigquery_table", "demoevents")
+
+DISABLE_MINIDASHBOARD = getattr(config, "gui_disable_minidashboard", False)
index 6c9acfa..49b144f 100644 (file)
@@ -18,14 +18,21 @@ from core.views.slivers import SliverList, SliverDetail
 from core.views.tags import TagList, TagDetail
 from core.views.users import UserList, UserDetail
 from core.views.legacyapi import LegacyXMLRPC
+#from core.views.analytics import AnalyticsAjaxView
 from core.models import *
 from core.api_root import api_root
 from rest_framework import generics
-from core.plus.sites import SitePlus
+from core.dashboard.sites import SitePlus
+from django.http import HttpResponseRedirect
 
 admin.site = SitePlus()
 admin.autodiscover()
 
+def redirect_to_apache(request):
+     """ bounce a request back to the apache server that is running on the machine """
+     apache_url = "http://%s%s" % (request.META['HOSTNAME'], request.path)
+     return HttpResponseRedirect(apache_url)
+
 urlpatterns = patterns('',
     # Examples:
     # url(r'^$', 'planetstack.views.home', name='home'),
@@ -40,7 +47,7 @@ urlpatterns = patterns('',
     #url(r'^profile/home', 'core.views.home'),
 
     url(r'^plstackapi/$', api_root),
-    
+
     url(r'^plstackapi/deployments/$', DeploymentList.as_view(), name='deployment-list'),
     url(r'^plstackapi/deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentDetail.as_view(), name='deployment-detail'),
 
@@ -89,6 +96,9 @@ urlpatterns = patterns('',
 
     url(r'^legacyapi/$', 'core.views.legacyapi.LegacyXMLRPC', name='xmlrpc'),
 
+#    url(r'^analytics/(?P<name>\w+)/$', AnalyticsAjaxView.as_view(), name="analytics"),
+
+    url(r'^files/', redirect_to_apache),
 
     #Adding in rest_framework urls
     url(r'^plstackapi/', include('rest_framework.urls', namespace='rest_framework')),
index 6abdaaf..a61e7ed 100644 (file)
@@ -19,6 +19,7 @@ ratelimit_enabled=0
 omf_enabled=0
 mail_support_address=support@localhost
 nova_enabled=True
+logfile=/var/log/planetstack.log
 
 [nova]
 admin_user=admin@domain.com
@@ -30,4 +31,6 @@ default_flavor=m1.small
 default_security_group=default
 
 [observer]
+images_directory=/opt/planetstack/images
 dependency_graph=/opt/planetstack/model-deps
+logfile=/var/log/planetstack_backend.log
index 30b7fad..36e5fc6 100644 (file)
@@ -10,7 +10,7 @@ from django.contrib.auth.signals import user_logged_in
 from django.utils import timezone
 from django.contrib.contenttypes import generic
 from suit.widgets import LinkedSelect
-from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline, SliceROInline,ServiceAttrAsTabROInline, ReadOnlyAwareAdmin
 
 class RequestRouterServiceAdmin(SingletonAdmin):
     model = RequestRouterService
@@ -20,12 +20,26 @@ class RequestRouterServiceAdmin(SingletonAdmin):
     fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description','behindNat','defaultTTL','defaultAction','lastResortAction','maxAnswers'], 'classes':['suit-tab suit-tab-general']})]
     inlines = [SliceInline,ServiceAttrAsTabInline]
 
+    user_readonly_fields = ["name", "enabled", "versionNumber", "description", "behindNat", "defaultTTL", "defaultAction", "lastResortAction", "maxAnswers"]
+    user_readonly_inlines = [SliceROInline, ServiceAttrAsTabROInline]
+
     suit_form_tabs =(('general', 'Request Router Service Details'),
         ('slices','Slices'),
         ('serviceattrs','Additional Attributes'),
     )
 
+class ServiceMapAdmin(ReadOnlyAwareAdmin):
+    model = ServiceMap
+    verbose_name = "Service Map"
+    verbose_name_plural = "Service Map"
+    list_display = ("name", "owner", "slice", "prefix")
+    fieldsets = [(None, {'fields': ['name','owner','slice', 'prefix','siteMap','accessMap'], 'classes':['suit-tab suit-tab-general']})]
+
+    user_readonly_fields = ["name", "owner", "slice", "prefix", "siteMap", "accessMap"]
+
+    suit_form_tabs =(('general', 'Service Map Details'),
+    )
 
 admin.site.register(RequestRouterService, RequestRouterServiceAdmin)
-admin.site.register(ClientMap)
+admin.site.register(ServiceMap, ServiceMapAdmin)
 
index 4350030..8e4cc43 100644 (file)
@@ -1,4 +1,4 @@
-from core.models import User,Site,Service,SingletonModel,PlCoreBase
+from core.models import User,Site,Service,SingletonModel,PlCoreBase, Slice
 import os
 from django.db import models
 from django.forms.models import model_to_dict
@@ -15,13 +15,27 @@ class RequestRouterService(SingletonModel,Service):
     defaultAction = models.CharField(max_length=30, default = "best", help_text="Review if this should be enum")
     lastResortAction = models.CharField(max_length=30, default = "random", help_text="Review if this should be enum")
     maxAnswers = models.PositiveIntegerField(default=3, help_text="Maximum number of answers in DNS response.")
-    
-    def __unicode__(self):  return u'RequestRouterService'
 
-class ClientMap(models.Model):
-    site = models.OneToOneField(Site, unique=True)
-    name = models.CharField(max_length=64, help_text="Name of the Client Map")
-    description = models.TextField(null=True, blank=True,max_length=130)
+    def __unicode__(self):  return u'Request Router Service'
+
+class ServiceMap(PlCoreBase):
+
+    class Meta:
+        app_label = "requestrouter"
+
+    name = models.SlugField(max_length=50, unique=True, blank=False, null=False, help_text="name of this service map")
+    owner = models.ForeignKey(Service, help_text="service which owns this map")
+    slice = models.ForeignKey(Slice, help_text="slice that implements this service")
+    prefix = models.CharField(max_length=256, help_text="FQDN of the region of URI space managed by RR on behalf of this service")
+       # need to fix the upload location appropriately, for now we are not using access/site map
+    siteMap = models.FileField(upload_to="maps/", help_text="maps client requests to service instances", blank=True)
+    accessMap = models.FileField(upload_to="maps/", help_text="specifies which client requests are allowed", blank=True)
+
+    def siteMapName(self):
+        return self.name + ".site"
+
+    def accessMapName(self):
+        return self.name + ".access"
+
+    def __unicode__(self): return u'%s' % self.name
 
-    def __unicode__(self):  return self.name
-    
diff --git a/planetstack/rr_observer/configurationPush.py b/planetstack/rr_observer/configurationPush.py
new file mode 100644 (file)
index 0000000..857de8b
--- /dev/null
@@ -0,0 +1,30 @@
+import ansible.playbook
+import ansible.constants as C
+import ansible.utils.template
+from ansible import errors
+from ansible import callbacks
+from ansible import utils
+from subprocess import call
+
+class ConfigurationPush:
+       def __init__(self):
+               pass
+
+       def config_push(self, service_name, user, playbook_name,hostfile):
+               '''stats = callbacks.AggregateStats()
+               playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
+               runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
+               pb = ansible.playbook.PlayBook(playbook="playbook/site.yml",
+                                       callbacks=playbook_cb,
+                                       runner_callbacks=runner_cb,
+                                       stats=stats
+                                       )
+               result = pb.run()
+               print result
+               '''
+
+               call("ansible-playbook --private-key=planetw "+playbook_name+" -i "+hostfile+" -u "+user+"  --extra-vars \"name="+service_name+"\"", shell=True)
+       
+
+if __name__ == "__main__":
+        main()
diff --git a/planetstack/rr_observer/deleters/servicemap_deleter.py b/planetstack/rr_observer/deleters/servicemap_deleter.py
new file mode 100644 (file)
index 0000000..b5d4509
--- /dev/null
@@ -0,0 +1,41 @@
+import os
+import sys
+import traceback
+from requestrouter.models import ServiceMap
+from observer.deleter import Deleter
+from util.logger import Logger, logging
+
+parentdir = os.path.join(os.path.dirname(__file__),"..")
+sys.path.insert(0,parentdir)
+
+from rrlib import RequestRouterLibrary
+from configurationPush import ConfigurationPush
+import rrlib_config
+
+logger = Logger(level=logging.INFO)
+
+class ServiceMapDeleter(Deleter, RequestRouterLibrary, ConfigurationPush):
+        model='ServiceMap'
+
+        def __init__(self, **args):
+            Deleter.__init__(self, **args)
+            RequestRouterLibrary.__init__(self)
+            ConfigurationPush.__init__(self)
+
+
+        def call(self, pk, model_dict):
+          try:
+              servicemap = ServiceMap.objects.get(pk=pk)
+              service_uid = self.get_servicemap_uid(servicemap)
+              self.config_push(service_uid, rrlib_config.REDIR_USER, "/opt/planetstack/rr_observer/playbook/site_redir_delete.yml", "/etc/ansible/requestrouter/dnsredir/hosts")
+              self.config_push(service_uid, rrlib_config.DEMUX_USER, "/opt/planetstack/rr_observer/playbook/site_demux_delete.yml", "/etc/ansible/requestrouter/dnsdemux/hosts")
+              print "XXX delete ServiceMap %s", servicemap.name
+              return True
+          except Exception, e:
+              traceback.print_exc()
+              logger.exception("Failed to erase map '%s'" % map_name)
+              return False
+
+if __name__ == "__main__":
+  smap = ServiceMapDeleter()
+  smap.call( 6, {'name': 'Service23'} )
diff --git a/planetstack/rr_observer/model-deps b/planetstack/rr_observer/model-deps
new file mode 100644 (file)
index 0000000..36ef620
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "ServiceMap": [
+        "Slice"
+    ], 
+    "Slice": [
+        "Site", 
+        "Service"
+    ], 
+    "User": [
+        "Site"
+    ]
+}
diff --git a/planetstack/rr_observer/playbook/roles/delete_demux/handlers/main.yml b/planetstack/rr_observer/playbook/roles/delete_demux/handlers/main.yml
new file mode 100644 (file)
index 0000000..a888468
--- /dev/null
@@ -0,0 +1,3 @@
+---
+- name: restart dnsdemux
+  service: name=dnsdemux state=restarted
diff --git a/planetstack/rr_observer/playbook/roles/delete_demux/tasks/main.yml b/planetstack/rr_observer/playbook/roles/delete_demux/tasks/main.yml
new file mode 100644 (file)
index 0000000..417401a
--- /dev/null
@@ -0,0 +1,5 @@
+---
+# This playbook contains plays to delete configuration files from dnsdemux slice
+- name: delete dnsdemux config files
+  file: path={{dst_dnsdemux_conf}}/{{name}}.conf state=absent
+  notify: restart dnsdemux
diff --git a/planetstack/rr_observer/playbook/roles/delete_demux/vars/main.yml b/planetstack/rr_observer/playbook/roles/delete_demux/vars/main.yml
new file mode 100644 (file)
index 0000000..b457050
--- /dev/null
@@ -0,0 +1,6 @@
+---
+# Variables listed here are applicable to all host groups
+
+src_dnsdemux: ../../../../temp_config/dnsdemux
+dst_dnsdemux_conf: /etc/dnsdemux/default/
+
diff --git a/planetstack/rr_observer/playbook/roles/delete_redir/handlers/main.yml b/planetstack/rr_observer/playbook/roles/delete_redir/handlers/main.yml
new file mode 100644 (file)
index 0000000..8aa497e
--- /dev/null
@@ -0,0 +1,3 @@
+---
+- name: restart dnsredir
+  service: name=dnsredir state=restarted
diff --git a/planetstack/rr_observer/playbook/roles/delete_redir/tasks/main.yml b/planetstack/rr_observer/playbook/roles/delete_redir/tasks/main.yml
new file mode 100644 (file)
index 0000000..58833bb
--- /dev/null
@@ -0,0 +1,13 @@
+---
+# This playbook contains plays to delete configuration files from dnsredir slice
+- name: delete  maps.d directory ( and deletes all intermeadiate directories )
+  #copy: src={{src_dnsredir}}/{{name}}.d dest={{dst_dnsredir_confdir}}
+  file: path={{dst_dnsredir_confdir}}/{{name}}.d/maps.d state=absent
+- name: delete config directory
+  file: path={{dst_dnsredir_confdir}}/{{name}}.d/ state=absent
+- name: copy dnsredir config file
+  file: path={{dst_dnsredir_conf}}/{{name}}.conf state=absent
+  notify: restart dnsredir
+
diff --git a/planetstack/rr_observer/playbook/roles/delete_redir/vars/main.yml b/planetstack/rr_observer/playbook/roles/delete_redir/vars/main.yml
new file mode 100644 (file)
index 0000000..dc79d35
--- /dev/null
@@ -0,0 +1,6 @@
+---
+# Variables listed here are applicable to all host groups
+
+src_dnsredir: ../../../../temp_config/dnsredir
+dst_dnsredir_conf: /etc/dnsredir/conf.d/
+dst_dnsredir_confdir: /etc/dnsredir
diff --git a/planetstack/rr_observer/playbook/roles/demux/handlers/main.yml b/planetstack/rr_observer/playbook/roles/demux/handlers/main.yml
new file mode 100644 (file)
index 0000000..a888468
--- /dev/null
@@ -0,0 +1,3 @@
+---
+- name: restart dnsdemux
+  service: name=dnsdemux state=restarted
diff --git a/planetstack/rr_observer/playbook/roles/demux/tasks/main.yml b/planetstack/rr_observer/playbook/roles/demux/tasks/main.yml
new file mode 100644 (file)
index 0000000..0339aed
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# This playbook contains plays to copy configurations to destination
+- name: copy dnsdemux config files
+  copy: src={{src_dnsdemux}}/{{name}}.conf dest={{dst_dnsdemux_conf}}/{{name}}.conf
+  notify: restart dnsdemux
+
+#- name: Start the dnsdemux service
+  #service: name=dnsdemux state=started enabled=true
+
diff --git a/planetstack/rr_observer/playbook/roles/demux/vars/main.yml b/planetstack/rr_observer/playbook/roles/demux/vars/main.yml
new file mode 100644 (file)
index 0000000..b457050
--- /dev/null
@@ -0,0 +1,6 @@
+---
+# Variables listed here are applicable to all host groups
+
+src_dnsdemux: ../../../../temp_config/dnsdemux
+dst_dnsdemux_conf: /etc/dnsdemux/default/
+
diff --git a/planetstack/rr_observer/playbook/roles/redir/handlers/main.yml b/planetstack/rr_observer/playbook/roles/redir/handlers/main.yml
new file mode 100644 (file)
index 0000000..8aa497e
--- /dev/null
@@ -0,0 +1,3 @@
+---
+- name: restart dnsredir
+  service: name=dnsredir state=restarted
diff --git a/planetstack/rr_observer/playbook/roles/redir/tasks/main.yml b/planetstack/rr_observer/playbook/roles/redir/tasks/main.yml
new file mode 100644 (file)
index 0000000..e390ed9
--- /dev/null
@@ -0,0 +1,19 @@
+---
+# This playbook contains plays to copy configurations to destination
+- name: create  maps.d directory ( and creates all intermeadiate directories )
+  #copy: src={{src_dnsredir}}/{{name}}.d dest={{dst_dnsredir_confdir}}
+  file: src={{src_dnsredir}}/{{name}}.d/maps.d dest={{dst_dnsredir_confdir}}/{{name}}.d/maps.d state=directory
+- name: copy map.conf
+  copy: src={{src_dnsredir}}/{{name}}.d/maps.d/map.conf dest={{dst_dnsredir_confdir}}/{{name}}.d/maps.d/map.conf
+- name: copy codeen_nodes.conf
+  copy: src={{src_dnsredir}}/{{name}}.d/codeen_nodes.conf dest={{dst_dnsredir_confdir}}/{{name}}.d/codeen_nodes.conf
+  
+- name: copy node-to-ip.txt
+  copy: src={{src_dnsredir}}/{{name}}.d/node-to-ip.txt dest={{dst_dnsredir_confdir}}/{{name}}.d/node-to-ip.txt
+
+- name: copy dnsredir config file
+  copy: src={{src_dnsredir}}/{{name}}.conf dest={{dst_dnsredir_conf}}/{{name}}.conf
+  notify: restart dnsredir
+
diff --git a/planetstack/rr_observer/playbook/roles/redir/vars/main.yml b/planetstack/rr_observer/playbook/roles/redir/vars/main.yml
new file mode 100644 (file)
index 0000000..dc79d35
--- /dev/null
@@ -0,0 +1,6 @@
+---
+# Variables listed here are applicable to all host groups
+
+src_dnsredir: ../../../../temp_config/dnsredir
+dst_dnsredir_conf: /etc/dnsredir/conf.d/
+dst_dnsredir_confdir: /etc/dnsredir
diff --git a/planetstack/rr_observer/playbook/site_demux.yml b/planetstack/rr_observer/playbook/site_demux.yml
new file mode 100644 (file)
index 0000000..b5261dc
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# This playbook copies the dnsdemux configuration files from temp directory.
+
+- name: copies the configuration files from temp directory
+  hosts: all
+  #remote_user: {{r_user}}
+
+  roles:
+    - demux
diff --git a/planetstack/rr_observer/playbook/site_demux_delete.yml b/planetstack/rr_observer/playbook/site_demux_delete.yml
new file mode 100644 (file)
index 0000000..49a7c87
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# This playbook deletes the dnsdemux configuration files from request router instances
+
+- name: deletes the configuration files from request router instances
+  hosts: all
+  #remote_user: {{r_user}}
+
+  roles:
+    - delete_demux
diff --git a/planetstack/rr_observer/playbook/site_redir.yml b/planetstack/rr_observer/playbook/site_redir.yml
new file mode 100644 (file)
index 0000000..50a7284
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# This playbook copies the dnsredir configuration files from temp directory.
+
+- name: copies the configuration files from temp directory
+  hosts: all
+  #remote_user: {{r_user}}
+
+  roles:
+    - redir
diff --git a/planetstack/rr_observer/playbook/site_redir_delete.yml b/planetstack/rr_observer/playbook/site_redir_delete.yml
new file mode 100644 (file)
index 0000000..9a8611d
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# This playbook deletes the dnsredir configuration files from request router instances
+
+- name: deletes the configuration files from request router instances
+  hosts: all
+  #remote_user: {{r_user}}
+
+  roles:
+    - delete_redir
diff --git a/planetstack/rr_observer/rr_observer_config b/planetstack/rr_observer/rr_observer_config
new file mode 100644 (file)
index 0000000..1fb52d0
--- /dev/null
@@ -0,0 +1,36 @@
+
+[plc]
+name=plc
+#deployment=VICCI
+deployment=VINI
+
+[db]
+name=planetstack
+user=plstackuser
+#password=2uMDYtJK
+password=1HL07C0E
+host=localhost
+port=5432
+
+[api]
+host=128.112.171.237
+port=8000
+ssl_key=None
+ssl_cert=None
+ca_ssl_cert=None
+ratelimit_enabled=0
+omf_enabled=0
+mail_support_address=support@localhost
+nova_enabled=True
+
+[observer]
+dependency_graph=/opt/planetstack/rr_observer/model-deps
+steps_dir=/opt/planetstack/rr_observer/steps
+deleters_dir=/opt/planetstack/rr_observer/deleters
+log_file=console
+#/var/log/hpc.log
+driver=None
+
+#[feefie]
+#client_id='vicci_dev_central'
+#user_id='pl'
diff --git a/planetstack/rr_observer/rrlib.py b/planetstack/rr_observer/rrlib.py
new file mode 100644 (file)
index 0000000..10a5171
--- /dev/null
@@ -0,0 +1,203 @@
+import os
+import base64
+import string
+import sys
+import socket
+from sets import Set
+if __name__ == '__main__':
+    sys.path.append("/opt/planetstack")
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+
+from planetstack.config import Config
+from core.models import Service
+from requestrouter.models import RequestRouterService, ServiceMap
+from util.logger import Logger, logging
+import rrlib_config
+
+logger = Logger(level=logging.INFO)
+
+'''
+Conventions:
+1) All dnsredir backend will listen at port 9000+ servicemap.pk ( where pk is the primary key generated in django model)
+'''
+
+class RequestRouterLibrary:
+
+    def __init__(self):
+        pass
+    
+    def gen_slice_info(self, service=None):   
+        """generates sliver information from slice of request router
+        """
+
+        if (service is None ):
+            service = RequestRouterService.objects.get()
+
+        mapping = {}
+        #static mapping for demo purpose 
+        #mapping["node47.princeton.vicci.org"] = "128.112.171.112"
+        mapping["node48.princeton.vicci.org"] = "128.112.171.114"
+    
+        '''for slice in service.service.all():
+            name = slice.name
+            for sliver in slice.slivers.all():
+                mapping[sliver.name] = str(sliver.ip)
+        '''
+        return mapping
+
+    def gen_servicemap_slice_info(self, servicemap):
+        """generates sliver information from slice of servicemap
+        """
+
+        wzone = Set(['arizona', 'stanford', 'on.lab', 'housten']) # zone=1 in cooden.conf
+        ezone = Set(['princeton', 'atlanta', 'new york', 'georgia tech']) # zone=2 in coodeen.conf
+
+        mapping_zone = {}
+        mapping_ip = {}
+        slice = servicemap.slice
+        name = slice.name
+        for sliver in slice.slivers.all():
+            mapping_ip[sliver.node.name] = socket.gethostbyname(sliver.node.name)
+            #print "sliver name "+sliver.name+str(sliver.ip)+"\n"
+            site = sliver.node.site.name
+            if(site.lower() in wzone):
+                mapping_zone[sliver.node.name] = str(1)
+            else:
+                mapping_zone[sliver.node.name] = str(2)
+
+        return mapping_ip, mapping_zone
+
+
+
+    def gen_slice_file(self, service):
+        """ generates host file for the slice information
+            to be used by ansible to push configuration files
+        """
+
+        mapping = self.gen_slice_info(service)
+
+        fn = "/etc/ansible/requestrouter/dnsredir/hosts"
+        f = open(fn, "w")
+        for (k,v) in mapping.items():
+            f.write("%s\n" % k)
+
+        fn = "/etc/ansible/requestrouter/dnsdemux/hosts"
+        f = open(fn, "w")
+        for (k,v) in mapping.items():
+            f.write("%s\n" % k)
+
+
+    def get_servicemap_uid(self, servicemap):
+        seq = ("service_", str(servicemap.pk));
+        return "".join(seq)
+
+    def get_service_port(self, servicemap):
+                return str(9000+servicemap.pk)
+
+    def gen_dnsredir_serviceconf(self, servicemap):
+        objname = self.get_servicemap_uid(servicemap)
+    
+        rr_mapping = self.gen_slice_info(None)
+    
+        #generate dnsredir.conf file parameters to be used in static file.
+        mapping = {}
+        mapping["port_listen"] = self.get_service_port(servicemap)
+        mapping["configdir"] = rrlib_config.DNSREDIR_CONFIGDIR_PREFIX+objname+".d/"
+        mapping["logdir"] = rrlib_config.DNSREDIR_LOGDIR_PREFIX+objname+".d"
+        mapping["pidfile"] = rrlib_config.DNSREDIR_PIDFILE_PREFIX+objname+".pid"
+        mapping["domain_name"] = servicemap.prefix      
+        mapping["heartbeat_port"] = rrlib_config.HEARTBEAT_PORT
+
+        #generate dnsredir.conf file 
+
+        fn = "./temp_config/dnsredir/"+objname+".conf"
+        f = open(fn, "w")
+        for (k,v) in rr_mapping.items():
+                        f.write(mapping["domain_name"]+". NS "+k+". "+v+" 3600 \n" % mapping)
+
+
+        f.write("""
+Default_TTL 30
+
+Port %(port_listen)s
+
+ConfigDir %(configdir)s
+
+MapsDir maps.d
+
+HTTPPort %(heartbeat_port)d
+
+PidFile %(pidfile)s
+
+HttpRequestPort 8081
+
+""" % mapping)
+
+        #generate configdirectory
+        
+        os.mkdir("./temp_config/dnsredir/"+objname+".d")
+        
+        #geenrate codeen_nodes.conf
+        mapping_ip, mapping_zone = self.gen_servicemap_slice_info(servicemap)
+
+        codeen_name = "./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf"
+        f = open(codeen_name, "w")
+        for (k,v) in mapping_zone.items():
+            f.write(k+" zone="+v+" \n")
+
+        iptxt = "./temp_config/dnsredir/"+objname+".d/node-to-ip.txt"
+        f = open(iptxt, "w")
+        for (k,v) in mapping_ip.items():
+            f.write(k+" "+v+" \n")
+
+        #generate maps directory
+        os.mkdir("./temp_config/dnsredir/"+objname+".d/maps.d")
+
+        # redirection map
+        map = "./temp_config/dnsredir/"+objname+".d/maps.d/map.conf"
+        f = open(map, "w")
+               #hardcoded probable public IP masks from arizona and princeton region respectively
+        f.write("prefix "+servicemap.prefix+" \n")
+        f.write("map 150.135.211.252/32 zone 1 || zone 2 \n")
+        f.write("map 128.112.171.112/24 zone 2 || zone 1 \n")
+        f.write("map 0.0.0.0/0 zone 1 || zone 2 \n")
+
+
+    def gen_dnsdemux_serviceconf(self, servicemap):
+        '''
+        generates frontend service*.conf file for each of the service
+        It assumes that there is a dnsdemux frontend running on the RR istallation and will
+        just add a conf file for each service in /etc/dnsdemux/default
+        '''
+        objname = self.get_servicemap_uid(servicemap)
+        #generate dnsdemux.conf file parameters to be used in static file.
+       
+        port_listen = self.get_service_port(servicemap)
+        domain_name = servicemap.prefix  
+        #generate service specific .conf file
+
+        rr_mapping = self.gen_slice_info(None)
+
+        fn = "./temp_config/dnsdemux/"+objname+".conf"
+        f = open(fn, "w")
+
+        for (k,v) in rr_mapping.items():
+            f.write("Forward "+v+" "+port_listen+" 8081 "+domain_name+".\n")
+
+    
+    def teardown_temp_configfiles(self, objname):
+        if os.path.exists("./temp_config/dnsdemux/"+objname+".conf"):
+            os.remove("./temp_config/dnsdemux/"+objname+".conf")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".d/maps.d/map.conf"):
+            os.remove("./temp_config/dnsredir/"+objname+".d/maps.d/map.conf")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".d/maps.d"):
+            os.rmdir("./temp_config/dnsredir/"+objname+".d/maps.d")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".d/node-to-ip.txt"):
+            os.remove("./temp_config/dnsredir/"+objname+".d/node-to-ip.txt")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf"):
+            os.remove("./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".d"):
+            os.rmdir("./temp_config/dnsredir/"+objname+".d")
+        if os.path.exists("./temp_config/dnsredir/"+objname+".conf"):
+            os.remove("./temp_config/dnsredir/"+objname+".conf")
+
diff --git a/planetstack/rr_observer/rrlib_config.py b/planetstack/rr_observer/rrlib_config.py
new file mode 100644 (file)
index 0000000..6d785e7
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/python
+
+DNSREDIR_CONFIGDIR_PREFIX = "/etc/dnsredir/"
+DNSREDIR_LOGDIR_PREFIX = "/var/log/dnsredir/"
+DNSREDIR_PIDFILE_PREFIX = "/var/run/dnsredir."
+REDIR_USER = "princeton_coredirect"
+#REDIR_USER = "arizona_tools1"
+#DEMUX_USER = "arizona_tools1"
+DEMUX_USER = "princeton_codnsdemux"
+HEARTBEAT_PORT = 9000
+#not required as of now, as there will be only one frontend dnsdemux for all the services
+#DNSDEMUX_CONFIGDIR_PREFIX = "/etc/dnsdemux/"
+#DNSDEMUX_LOGDIR_PREFIX = "/var/log/dnsdemux/"
+#DNSDEMUX_PIDFILE_PREFIX = "/var/run/dnsdemux."
+
+TBD = "TBD"
diff --git a/planetstack/rr_observer/steps/sync_requestrouterservices.py b/planetstack/rr_observer/steps/sync_requestrouterservices.py
new file mode 100644 (file)
index 0000000..546b45d
--- /dev/null
@@ -0,0 +1,46 @@
+import os
+import sys
+import base64
+import traceback
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.syncstep import SyncStep
+from core.models import Service
+from requestrouter.models import RequestRouterService
+from util.logger import Logger, logging
+
+parentdir = os.path.join(os.path.dirname(__file__),"..")
+sys.path.insert(0,parentdir)
+
+from rrlib import RequestRouterLibrary
+
+logger = Logger(level=logging.INFO)
+
+class SyncRequestRouterService(SyncStep, RequestRouterLibrary):
+    provides=[RequestRouterService]
+    requested_interval=0
+
+    def __init__(self, **args):
+        SyncStep.__init__(self, **args)
+        RequestRouterLibrary.__init__(self)
+
+    def fetch_pending(self):
+       try:
+               ret = RequestRouterService.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+               return ret
+       except Exception, e:
+               traceback.print_exc()
+               return None     
+
+    def sync_record(self, rr_service):
+       try:
+               print "syncing service!"
+               logger.info("sync'ing rr_service %s" % str(rr_service))
+               self.gen_slice_file(rr_service)
+               rr_service.save()
+               return True
+       except Exception, e:
+                traceback.print_exc()
+                return False
+
+
diff --git a/planetstack/rr_observer/steps/sync_servicemap.py b/planetstack/rr_observer/steps/sync_servicemap.py
new file mode 100644 (file)
index 0000000..76d2fdd
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/python
+
+import os
+import sys
+import base64
+import traceback
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.syncstep import SyncStep
+from core.models import Service
+from requestrouter.models import ServiceMap
+from util.logger import Logger, logging
+
+parentdir = os.path.join(os.path.dirname(__file__),"..")
+sys.path.insert(0,parentdir)
+
+from rrlib import RequestRouterLibrary
+from configurationPush import ConfigurationPush
+import rrlib_config
+
+logger = Logger(level=logging.INFO)
+
+class SyncServiceMap(SyncStep, RequestRouterLibrary, ConfigurationPush):
+    provides=[ServiceMap]
+    requested_interval=0
+
+    def __init__(self, **args):
+        SyncStep.__init__(self, **args)
+       RequestRouterLibrary.__init__(self)
+       ConfigurationPush.__init__(self)
+
+    def fetch_pending(self):
+       try:
+               ret = ServiceMap.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+               return ret
+       except Exception, e:
+               traceback.print_exc()
+               return None
+
+    def sync_record(self, servicemap):
+       try:
+               print "sync! %s " % self.get_servicemap_uid(servicemap)
+               self.gen_dnsredir_serviceconf(servicemap)
+               self.gen_dnsdemux_serviceconf(servicemap)
+               # push generated files from temp_config
+               service_uid = self.get_servicemap_uid(servicemap)
+               self.config_push(service_uid, rrlib_config.REDIR_USER, "/opt/planetstack/rr_observer/playbook/site_redir.yml", "/etc/ansible/requestrouter/dnsredir/hosts")
+               self.config_push(service_uid, rrlib_config.DEMUX_USER, "/opt/planetstack/rr_observer/playbook/site_demux.yml", "/etc/ansible/requestrouter/dnsdemux/hosts")
+               self.teardown_temp_configfiles(service_uid)
+       except Exception, e:
+                traceback.print_exc()
+                return False
+
+if __name__ == "__main__":
+    sv = SyncServiceMap()
+
+    recs = sv.fetch_pending()
+
+    for rec in recs:
+        sv.sync_record( rec )
diff --git a/planetstack/scripts/opencloud b/planetstack/scripts/opencloud
new file mode 100755 (executable)
index 0000000..d8e367a
--- /dev/null
@@ -0,0 +1,138 @@
+#!/bin/sh
+
+if [ -z "$1" ]; then
+    echo usage: $0 "[initdb | createdb | dropdb | syncdb | runserver | resetdb | dumpdata]"
+    exit
+fi
+
+BACKUP_DIR=/opt/planetstack_backups
+
+cd /opt/planetstack
+
+function ensure_postgres_running {
+    # "sudo -u postgres pg_ctl -D /var/lib/postgres/data status" doesn't work
+    # right on Vicci, so let's try to detect it by seeing if the port is
+    # being listened on
+
+    netstat -nl | grep -i ":5432 "
+    if [[ $? == 0 ]]; then
+        echo "Postgres is already running"
+        return
+    fi
+
+    /sbin/service postgresql initdb
+    /sbin/service postgresql start
+    /sbin/chkconfig postgresql on
+
+    netstat -nl | grep -i ":5432 "
+    if [[ $? != 0 ]]; then
+        # it's still not running
+        echo "Trying fallback mechanism to start Postgres"
+        sudo -u postgres initdb -D /var/lib/pgsql/data/
+        sudo -u postgres pg_ctl -D /var/lib/pgsql/data -l logfile start
+    fi
+
+}
+function createdb {
+    echo "Creating OpenCloud database..."
+    sudo -u postgres createdb planetstack
+}
+function dropdb {
+    echo "Dropping OpenCloud database..."
+    sudo -u postgres dropdb planetstack
+}
+function syncdb {
+    echo "Syncing OpenCloud services..."
+    python /opt/planetstack/manage.py syncdb --noinput
+}
+function evolvedb {
+    echo "Syncing OpenCloud services..."
+    python /opt/planetstack/manage.py evolve --hint --execute --noinput
+}
+function stopserver {
+    echo "Stopping any running OpenCloud Service(s)"
+    pkill -f "python.*runserver"
+}
+function runserver {
+    PUBLIC_HOSTNAME=`/opt/planetstack/planetstack-config.py get server_hostname $HOSTNAME`
+    echo "Starting OpenCloud Service on $PUBLIC_HOSTNAME:8000"
+    python manage.py runserver  $PUBLIC_HOSTNAME:8000&
+}
+
+function dumpdata {
+    mkdir -p $BACKUP_DIR
+    FN="$BACKUP_DIR/dumpdata-`date +%Y-%m-%d_%H:%M:%S`.json"
+    echo "Saving data to $FN"
+    python manage.py dumpdata core hpc syndicate requestrouter --indent 4 > $FN
+    if [[ ! -f $FN ]]; then
+        echo "FAILED to create $FN"
+        exit
+    fi
+    SIZE=$(du -k "$FN" | cut -f 1)
+    if [[ $SIZE -lt 9 ]]; then
+        echo "Dumpdata was empty. Deleting and aborting"
+        rm $FN
+        exit
+    fi
+    rm -f $BACKUP_DIR/dumpdata-latest.json
+    ln -s $FN $BACKUP_DIR/dumpdata-latest.json
+}
+
+COMMAND=$1
+
+if [ "$COMMAND" = "initdb" ]; then
+    stopserver
+    ensure_postgres_running
+    createdb
+    syncdb
+fi
+if [ "$COMMAND" = "repairdb" ]; then
+    stopserver
+    ensure_postgres_running
+    dumpdata
+    # TODO: This is where we could run migration scripts to upgrade the
+    #   dumped data to the new models.
+    mv /opt/planetstack/core/fixtures/initial_data.json /opt/planetstack/core/fixtures/initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json /opt/planetstack/core/fixtures/initial_data.json
+    dropdb
+    createdb
+    syncdb
+fi
+if [ "$COMMAND" = "restoredb" ]; then
+    if [[ ! -f $BACKUP_DIR/dumpdata-latest.json ]]; then
+       echo There is no dumpdata to restore
+       exit
+    fi
+    stopserver
+    ensure_postgres_running
+    mv /opt/planetstack/core/fixtures/initial_data.json /opt/planetstack/core/fixtures/initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json /opt/planetstack/core/fixtures/initial_data.json
+    dropdb
+    createdb
+    syncdb
+fi
+if [ "$COMMAND" = "evolvedb" ]; then
+    stopserver
+    ensure_postgres_running
+    evolvedb
+fi
+if [ "$COMMAND" = "resetdb" ]; then
+    stopserver
+    dropdb
+    createdb
+    syncdb
+fi
+if [ "$COMMAND" = "syncdb" ]; then
+    stopserver
+    syncdb
+fi
+if [ "$COMMAND" = "runserver" ]; then
+    stopserver
+    runserver
+fi
+if [ "$COMMAND" = "stopserver" ]; then
+    stopserver
+fi
+if [ "$COMMAND" = "dumpdata" ]; then
+    dumpdata
+fi
index 85c3ebd..e9f499c 100644 (file)
@@ -14,6 +14,7 @@ from core.admin import ReadOnlyTabularInline,ReadOnlyAwareAdmin,SingletonAdmin,S
 from suit.widgets import LinkedSelect
 from bitfield import BitField
 from bitfield.forms import BitFieldCheckboxSelectMultiple
+from django.core.exceptions import ValidationError, ObjectDoesNotExist
 
 class SyndicateServiceAdmin(SingletonAdmin,ReadOnlyAwareAdmin):
     model = SyndicateService
@@ -31,6 +32,7 @@ class SyndicateServiceAdmin(SingletonAdmin,ReadOnlyAwareAdmin):
         ('serviceattrs','Additional Attributes'),
     )
 
+
 class VolumeAccessRightForUserROInline(ReadOnlyTabularInline):
     model = VolumeAccessRight
     extra = 0
@@ -47,40 +49,10 @@ class VolumeAccessRightInline(PlStackTabularInline):
     model = VolumeAccessRight
     extra = 0
     suit_classes = 'suit-tab suit-tab-volumeAccessRights'
-
-class VolumeAccessRightAdmin(ReadOnlyAwareAdmin):
-    model = VolumeAccessRight
-
-    formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple},}
-    list_display = ['owner_id', 'volume']
-    user_readonly_fields = ['owner_id','volume','gateway_caps']
-    user_readonly_inlines = []
-
-class VolumeAccessRequestForUserROInline(ReadOnlyTabularInline):
-    model = VolumeAccessRequest
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-volumeAccessRequests'
-    fields = ['volume', 'message']
-
-class VolumeAccessRequestROInline(ReadOnlyTabularInline):
-    model = VolumeAccessRequest
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-volumeAccessRequests'
-    fields = ['owner_id', 'message']
-
-class VolumeAccessRequestInline(PlStackTabularInline):
-    model = VolumeAccessRequest
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-volumeAccessRequests'
-    fields = ['owner_id', 'message']
-
-class VolumeAccessRequestAdmin(ReadOnlyAwareAdmin):
-    model = VolumeAccessRequest
-
-    formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple},}
-    list_display = ['owner_id', 'volume', 'message']
-    user_readonly_fields = ['volume','owner_id','message','message', 'gateway_caps']
-    user_readonly_inlines = []
+    formfield_overrides = {
+        BitField: {'widget': BitFieldCheckboxSelectMultiple}
+    }
+    fields = ('owner_id', 'gateway_caps')
 
 class VolumeInline(PlStackTabularInline):
     model = Volume
@@ -94,56 +66,123 @@ class VolumeROInline(ReadOnlyTabularInline):
     suit_classes = 'suit-tab suit-tab-volumes'
     fields = ['name', 'owner_id']
 
+
+class VolumeSliceFormSet( forms.models.BaseInlineFormSet ):
+    # verify that our VolumeSlice is valid
+
+    @classmethod
+    def verify_unchanged( cls, volume_pk, slice_pk, field_name, new_value ):
+        vs = None
+        try:
+           vs = VolumeSlice.objects.get( volume_id=volume_pk, slice_id=slice_pk )
+        except ObjectDoesNotExist, dne:
+           return True, None
+
+        old_value = getattr( vs, field_name )
+        if old_value != new_value:
+            return False, old_value
+        else:
+            return True, None
+
+
+    def clean( self ):
+        for form in self.forms:
+            # check each inline's cleaned data, if it's valid
+            cleaned_data = None
+            try:
+                if form.cleaned_data:
+                    cleaned_data = form.cleaned_data
+            except AttributeError:
+                continue
+
+            # verify that the ports haven't changed 
+            volume_pk = cleaned_data['volume_id'].pk
+            slice_pk = cleaned_data['slice_id'].pk
+           
+            if not cleaned_data.has_key('peer_portnum'):
+                raise ValidationError("Missing client peer-to-peer cache port number")
+
+            if not cleaned_data.has_key('replicate_portnum'):
+                raise ValidationError("Missing replication service port number")
+
+            rc1, old_peer_port = VolumeSliceFormSet.verify_unchanged( volume_pk, slice_pk, 'peer_portnum', cleaned_data['peer_portnum'] )
+            rc2, old_replicate_port = VolumeSliceFormSet.verify_unchanged( volume_pk, slice_pk, 'replicate_portnum', cleaned_data['replicate_portnum'] )
+
+            err1str = ""
+            err2str = ""
+            if not rc1:
+                err1str = "change %s back to %s" % (cleaned_data['peer_portnum'], old_peer_port)
+            if not rc2:
+                err2str = " and change %s back to %s" % (cleaned_data['replicate_portnum'], old_replicate_port )
+
+            if not rc1 or not rc2:
+                raise ValidationError("Port numbers cannot be changed once they are set. Please %s %s" % (err1str, err2str))
+            
+            
+
+class VolumeSliceInline(PlStackTabularInline):
+    model = VolumeSlice
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-volumeSlices'
+    fields = ['volume_id', 'slice_id', 'gateway_caps', 'peer_portnum', 'replicate_portnum']
+    formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple},}
+
+    formset = VolumeSliceFormSet
+    
+    readonly_fields = ['credentials_blob']
+
+class VolumeSliceROInline(ReadOnlyTabularInline):
+    model = VolumeSlice
+    extra = 0
+    suit_classes = 'suit-tab suit-tab-volumeSlices'
+    fields = ['volume_id', 'slice_id', 'gateway_caps', 'peer_portnum', 'replicate_portnum']
+    formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple},}
+
+    formset = VolumeSliceFormSet
+
+    readonly_fields = ['credentials_blob']
+
+
 class VolumeAdmin(ReadOnlyAwareAdmin):
     model = Volume
-    read_only_fields = ['blockSize']
+   
+    def get_readonly_fields(self, request, obj=None ):
+       always_readonly = list(super(VolumeAdmin, self).get_readonly_fields(request, obj))
+       if obj == None:
+          # all fields are editable on add
+          return always_readonly
+
+       else:
+          # can't change owner, slice id, or block size on update
+          return ['blocksize', 'owner_id'] + always_readonly
+
+
     list_display = ['name', 'owner_id']
 
     formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple},}
 
-    detailsFieldList = ['name', 'owner_id', 'description','file_quota','blocksize', 'private','archive', 'default_gateway_caps' ]
-    keyList = ['metadata_public_key','metadata_private_key','api_public_key']
-
+    #detailsFieldList = ['name', 'owner_id', 'description','file_quota','blocksize', 'private','archive', 'default_gateway_caps' ]
+    detailsFieldList = ['name', 'owner_id', 'description','blocksize', 'private','archive', 'default_gateway_caps' ]
+    
     fieldsets = [
         (None, {'fields': detailsFieldList, 'classes':['suit-tab suit-tab-general']}),
-        (None, {'fields': keyList, 'classes':['suit-tab suit-tab-volumeKeys']}),
+        #(None, {'fields': keyList, 'classes':['suit-tab suit-tab-volumeKeys']}),
     ]
 
-    inlines = [VolumeAccessRightInline, VolumeAccessRequestInline]
-
-    user_readonly_fields = ['name','owner_id','description','blocksize','private','metadata_public_key','metadata_private_key','api_public_key','file_quota','default_gateway_caps']
-    user_readonly_inlines = [VolumeAccessRightROInline, VolumeAccessRequestROInline]
+    inlines = [VolumeAccessRightInline, VolumeSliceInline]
 
-    suit_form_tabs =(('general', 'Volume Details'),
-                     ('volumeKeys', 'Access Keys'),
-                     ('volumeAccessRequests', 'Volume Access Requests'),
-                     ('volumeAccessRights', 'Volume Access Rights'),
-    )
+    user_readonly_fields = ['name','owner_id','description','blocksize','private','default_gateway_caps']
     
-    
-
-class SyndicateUserAdmin(ReadOnlyAwareAdmin):
-    model = SyndicateUser
-    verbose_name = "Users"
-    verbose_name = "Users"
-    list_display = ['user','is_admin', 'max_volumes']
-    inlines = [VolumeInline,VolumeAccessRequestInline,VolumeAccessRightInline]
-    user_readonly_fields = ['user','is_admin','max_volumes','max_UGs','max_RGs','max_AGs']
-    user_readonly_inlines = [VolumeROInline,VolumeAccessRequestForUserROInline,VolumeAccessRightForUserROInline]
-
-    fieldsets = [
-        (None, {'fields': ['user','is_admin','max_volumes','max_UGs','max_RGs','max_AGs'], 'classes':['suit-tab suit-tab-general']}),
-    ]
+    user_readonly_inlines = [VolumeAccessRightROInline, VolumeSliceROInline]
 
     suit_form_tabs =(('general', 'Volume Details'),
-                     ('volumes', 'Volumes'),
-                     ('volumeAccessRequests', 'Volume Access Requests'),
+                     #('volumeKeys', 'Access Keys'),
+                     ('volumeSlices', 'Slices'),
                      ('volumeAccessRights', 'Volume Access Rights'),
     )
+    
 
+# left panel:
 admin.site.register(SyndicateService, SyndicateServiceAdmin)
-admin.site.register(VolumeAccessRight, VolumeAccessRightAdmin)
-admin.site.register(VolumeAccessRequest, VolumeAccessRequestAdmin)
 admin.site.register(Volume, VolumeAdmin)
-admin.site.register(SyndicateUser, SyndicateUserAdmin)
-
index efc08c6..656e881 100644 (file)
@@ -1,8 +1,9 @@
-from core.models import User,Site,Service,SingletonModel,PlCoreBase
+from core.models import User,Site,Service,SingletonModel,PlCoreBase,Slice
 import os
 from django.db import models
 from django.forms.models import model_to_dict
 from bitfield import BitField
+from django.core.exceptions import ValidationError
 
 # Create your models here.
 
@@ -14,51 +15,79 @@ class SyndicateService(SingletonModel,Service):
 
     def __unicode__(self):  return u'Syndicate Service'
 
-class SyndicateUser(models.Model):
 
-    user = models.ForeignKey(User)
-    is_admin = models.BooleanField(default=False, help_text="Indicates this user has Administrative purposes for the Syndicate Service")
-    max_volumes = models.PositiveIntegerField(help_text="Maximum number of Volumes this user may create.", default=1)
-    max_UGs = models.PositiveIntegerField(help_text="Maximum number of User Gateways this user may create.", default=500)
-    max_RGs = models.PositiveIntegerField(help_text="Maximum number of Replica Gateways this user may create.", default=500)
-    max_AGs = models.PositiveIntegerField(help_text="Maximum number of Aquisition Gateways this user may create.", default=10)
-    
-    def __unicode__(self):  return self.user.email
-    
-class Volume(models.Model):
+class SyndicatePrincipal(PlCoreBase):
+    class Meta:
+        app_label = "syndicate"
+
+    # for now, this is a user email address 
+    principal_id = models.TextField()
+    public_key_pem = models.TextField()
+    sealed_private_key = models.TextField()
+
+    def __unicode__self(self):  return "%s" % self.principal_id
+
+
+class Volume(PlCoreBase):
+    class Meta:
+        app_label = "syndicate"
+
     name = models.CharField(max_length=64, help_text="Human-readable, searchable name of the Volume")
-    owner_id = models.ForeignKey(SyndicateUser, verbose_name='Owner')
+    
+    owner_id = models.ForeignKey(User, verbose_name='Owner')
+
     description = models.TextField(null=True, blank=True,max_length=130, help_text="Human-readable description of what this Volume is used for.")
     blocksize = models.PositiveIntegerField(help_text="Number of bytes per block.")
     private = models.BooleanField(default=True, help_text="Indicates if the Volume is visible to users other than the Volume Owner and Syndicate Administrators.")
-    archive = models.BooleanField(default=True, help_text="Indicates if this Volume is read-only, and only an Aquisition Gateway owned by the Volume owner (or Syndicate admin) can write to it.")
-    metadata_public_key = models.TextField(null=True, blank=True, max_length=1024, help_text="Public key Gateways will use to verify the authenticity of metadata from this Volume")
-    metadata_private_key = models.TextField(null=True, blank=True, max_length=1024, help_text="Private key the Volume should use to sign metadata served to Gateways")
-    api_public_key = models.TextField(null=True, blank=True, max_length=1024, help_text="Public key used to verify writes to these fields from Volume owner")
-
-    file_quota = models.IntegerField(help_text='Maximum number of files and directories allowed in this Volume (-1 means "unlimited")')
+    archive = models.BooleanField(default=False, help_text="Indicates if this Volume is read-only, and only an Aquisition Gateway owned by the Volume owner (or Syndicate admin) can write to it.")
 
-    default_gateway_caps = BitField(flags=('GATEWAY_CAP_READ_DATA','GATEWAY_CAP_READ_METADATA', 'GATEWAY_CAP_WRITE_DATA', 'GATEWAY_CAP_WRITE_METADATA', 'GATEWAY_CAP_COORDINATE'), verbose_name='Default Gateway Capabilities')
-    #default_gateway_caps = models.PositiveIntegerField(verbose_name='Default Gateway Capabilities')
-    #default_gateway_caps2 = models.CharField(max_length=32,null=True,default = "readonly", verbose_name='Default Gateway Capabilities')
+    CAP_READ_DATA = 1
+    CAP_WRITE_DATA = 2
+    CAP_HOST_DATA = 4
+    
+    # NOTE: preserve order of capabilities here...
+    default_gateway_caps = BitField(flags=("read data", "write data", "host files"), verbose_name='Default User Capabilities')
 
     def __unicode__(self):  return self.name
 
-class VolumeAccessRight(models.Model):
-    owner_id = models.ForeignKey(SyndicateUser, verbose_name='user')
-    volume = models.ForeignKey(Volume)
-    gateway_caps = BitField(flags=('GATEWAY_CAP_READ_DATA','GATEWAY_CAP_READ_METADATA', 'GATEWAY_CAP_WRITE_DATA', 'GATEWAY_CAP_WRITE_METADATA', 'GATEWAY_CAP_COORDINATE'), verbose_name='Gateway Capabilities')
-    #gateway_caps = models.PositiveIntegerField(verbose_name='Gateway Capabilities')
-    #gateway_caps2 = models.CharField(max_length=32, default='readonly',null=True,verbose_name='Default Gateway Capabilities')
 
-    def __unicode__(self):  return self.owner_id.user.email
+class VolumeAccessRight(PlCoreBase):
+    class Meta:
+        app_label = "syndicate"
 
-class VolumeAccessRequest(models.Model):
-    owner_id = models.ForeignKey(SyndicateUser, verbose_name='user')
+    owner_id = models.ForeignKey(User, verbose_name='user')
+    
     volume = models.ForeignKey(Volume)
-    message = models.TextField(null=True, blank=True, max_length=1024, help_text="Description of why the user wants access to the volume.")
-    gateway_caps = BitField(flags=('GATEWAY_CAP_READ_DATA','GATEWAY_CAP_READ_METADATA', 'GATEWAY_CAP_WRITE_DATA', 'GATEWAY_CAP_WRITE_METADATA', 'GATEWAY_CAP_COORDINATE'), verbose_name='Gateway Capabilities')
-    #gateway_caps = models.PositiveIntegerField(verbose_name='Gateway Capabilities')
-    #gateway_caps2 = models.CharField(max_length=32,default='readonly',null=True,verbose_name='Default Gateway Capabilities')
+    gateway_caps = BitField(flags=("read data", "write data", "host files"), verbose_name="User Capabilities")
+
+    def __unicode__(self):  return "%s-%s" % (self.owner_id.email, self.volume.name)
+
+
+class VolumeSlice(PlCoreBase):
+    class Meta:
+        app_label = "syndicate"
+
+    volume_id = models.ForeignKey(Volume, verbose_name="Volume")
+    slice_id = models.ForeignKey(Slice, verbose_name="Slice")
+    gateway_caps = BitField(flags=("read data", "write data", "host files"), verbose_name="Slice Capabilities")
+    
+    peer_portnum = models.PositiveIntegerField(help_text="User Gateway port", verbose_name="Client peer-to-peer cache port")
+    replicate_portnum = models.PositiveIntegerField(help_text="Replica Gateway port", verbose_name="Replication service port")
+
+    credentials_blob = models.TextField(null=True, blank=True, help_text="Encrypted slice credentials")
+    def __unicode__(self):  return "%s-%s" % (self.volume_id.name, self.slice_id.name)
+
+    def clean(self):
+        """
+        Verify that our fields are in order:
+            * peer_portnum and replicate_portnum have to be valid port numbers between 1025 and 65534
+            * peer_portnum and replicate_portnum cannot be changed once set.
+        """
+
+        if self.peer_portnum < 1025 or self.peer_portnum > 65534:
+            raise ValidationError( "Client peer-to-peer cache port number must be between 1025 and 65534" )
+
+        if self.replicate_portnum < 1025 or self.replicate_portnum > 65534:
+            raise ValidationError( "Replication service port number must be between 1025 and 65534" )
 
-    def __unicode__(self):  return self.owner_id.user.email
index b9ea01c..b361058 100644 (file)
@@ -1,4 +1,4 @@
-{% load admin_static %}{% load suit_tags %}{% load url from future %}<!DOCTYPE html>
+{% load admin_static %}{% load suit_tags %}{% load url from future %}<!DOCTYPE html>
 <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
 <head>
   <title>{% block title %}  {%if title %} {{ title }} | {% endif %} {{ 'ADMIN_NAME'|suit_conf }}{% endblock %}</title>
@@ -9,7 +9,12 @@
   {% block extrastyle %}{% endblock %}
   {% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}"/>{% endif %}
   <script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script>
-  <script src="{% static 'suit/js/jquery-1.8.3.min.js' %}"></script>
+  <script src="{% static 'suit/js/jquery-1.9.1.min.js' %}"></script>
+  <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
+  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
+<script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
+
+
   <script type="text/javascript">var Suit = { $: $.noConflict() }; if (!$) $ = Suit.$; </script>
   {% if 'SHOW_REQUIRED_ASTERISK'|suit_conf %}
   <style type="text/css">.required:after { content: '*'; margin: 0 0 0 5px; position: absolute; color: #ccc;}</style>
@@ -18,7 +23,6 @@
   {% block blockbots %}
     <meta name="robots" content="NONE,NOARCHIVE"/>{% endblock %}
   <link rel="shortcut icon" href="{% static 'favicon.png' %}">
-
 </head>
 {% load i18n %}
 
   {% block container %}
     <div id="container">
 
+             <a href="{% url 'admin:index' %}"><h1 id="site-name"><img class="logo" height="70" width="259" src="{% static 'open-cloud-login-themed-light.png' %}"/></h1></a>
       {% block header %}
         {% if not is_popup %}
           <!-- Header -->
           <div id="header" class="header">
             
             <div id="branding">
-              <table width="100%">
-                <tr>
-                  <td width="70%">
-             <!-- <a href="{% url 'admin:index' %}"><h1 id="site-name">{% block branding %}{{ 'ADMIN_NAME'|suit_conf }}{% endblock %}</h1></a>-->
-             <a href="{% url 'admin:index' %}"><h1 id="site-name"><img src="{% static 'open-cloud-themed.png' %}"/></h1></a>
-             </td>
-              <td width="30%">
                   {% block quick-search %}
                 {% with 'SEARCH_URL'|suit_conf as search_url %}
                   {% if search_url %}
@@ -55,9 +53,6 @@
                   {% endif %}
                 {% endwith %}
               {% endblock %}
-                 </td>
-               </tr>
-             </table>
             </div>
           
             {% block header_time %}
@@ -88,9 +83,7 @@
             {% if user.is_active and user.is_staff %}
               <div id="user-tools">
                 {% trans 'Welcome,' %}
-                <strong>
-                  {% filter force_escape %}
-                    {% firstof user.first_name user.username %}{% endfilter %}</strong>.
+                <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">{{user.email}}</a>
                 <span class="user-links">
                 {% block userlinks %}
                   {% url 'django-admindocs-docroot' as docsroot %}
           <div id="suit-center" class="suit-column">
 
             {% if not is_popup %}
+            <div id=openCloudTopPage>
+            {% include "/opt/planetstack/templates/admin/newminidashboard.html" %}
+            </div>
+
               {% block breadcrumbs %}
                 <ul class="breadcrumb"> 
                   <li><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
                     </li>
                 </ul>
               {% endblock %}
-               <label class="nodetextbox" >Active Nodes: </label>
-              <label class="nodelabel" >37</label>
-              <label class="nodetextbox">CPU Utilization: </label>
-              <label class="nodelabel" >12%</label>
-            <label class="nodetextbox">Bytes Transferred:</label>     
-              <label class="nodelabel" style="width:60px;">4321GB</label>
             {% endif %}
 
             {% block messages %}
               {% endblock %}
             </div>
             <!-- END Content -->
+          <span class="clearfix"></span>
           </div>
         {% endblock %}
 
         {% endblock %}
       </div>
 
-      <div class="copyright">
+      <!-- <div class="copyright">
         {% block copyright %}
           Copyright &copy; 2013 DjangoSuit.com<br>Developed by <a href="http://djangosuit.com" target="_blank">DjangoSuit.com</a>
         {% endblock %}
-      </div>
+      </div> -->
 
       <div class="branding">{% block footer_branding %}
         {% with 'ADMIN_NAME'|suit_conf as admin_name %}
 
   <script src="{% static 'suit/bootstrap/js/bootstrap.min.js' %}"></script>
   <script src="{% static 'suit/js/suit.js' %}"></script>
+  <script src="{% static 'page_analytics.js' %}"></script>
+  <script type="text/javascript" src="//www.google.com/jsapi"></script>
+  <script src="{% static 'planetstack_graphs.js' %}"></script>
+  <!-- src="{% static 'planetstack_graphs_old.js' %}" -->
+
   {% block extrajs %}{% endblock %}
+<script src="http://d3js.org/d3.v3.js"></script>
+       <div class="modal fade hide" id="chartsModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+         <div class="modal-dialog">
+           <div class="modal-content">
+             <!--<div class="modal-header">
+               <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+               <h4 class="modal-title" id="myModalLabel">OpenCloud</h4>
+             </div>-->
+             <div class="modal-body" style="overflow-y:hidden; overflow-x:hidden;">
+               <div class="chartContainer">
+                       <div class="row">
+                               <div class=" padding">
+                               </div>
+                       </div>
+
+                       <div class="row">
+                               <div class=" heading">
+                                       <p id="chartHeading" class="heading">OpenCloud</p>      
+                               </div>
+                       </div>
+                       <div class="row">
+                               <div class="padding"></div>
+                               <div class="padding"></div>
+                       </div>
+                       <div class="row">
+                               <div id="graph" class="graph">
+                               </div>
+                       </div>
+               </div>
+                <div id="graph_work" style="display:none"></div>
+             </div>
+             <!--<div class="modal-footer">
+               <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+             </div>-->
+           </div><!-- /.modal-content -->
+         </div><!-- /.modal-dialog -->
+       </div><!-- /.modal -->
+
+
+<script>
+
+
+
 
+</script>
 </body>
 </html>
diff --git a/planetstack/templates/admin/dashboard/cdn_nodes.html b/planetstack/templates/admin/dashboard/cdn_nodes.html
new file mode 100644 (file)
index 0000000..d93667d
--- /dev/null
@@ -0,0 +1,106 @@
+<div id="tabs-6">
+<div class="row">
+        <span><b>Content Provider:</b></span>
+        <span><select id="cdn-node-data-slicename">
+        <option value="all">all</option>
+        {% for cp in cdnContentProviders %}
+           <option value="{{ cp.account }}">{{ cp.name }}</option>
+        {% endfor %}
+        </select></span>
+</div>
+<div id="cdn-node-table"></div>
+</div>
+<script>
+
+function domain_name_sort(a,b) {
+        parts_a = a.split(".");
+        parts_b = b.split(".");
+        parts_a = parts_a.reverse();
+        parts_b = parts_b.reverse();
+        a = parts_a.join(".");
+        b = parts_b.join(".");
+       return ((a < b) ? -1 : ((a > b) ?  1 : 0));
+}
+
+jQuery.fn.dataTableExt.oSort['domain-name-asc']  = function(a,b) {
+    return domain_name_sort(a,b);
+};
+
+jQuery.fn.dataTableExt.oSort['domain-name-desc']  = function(a,b) {
+    retuirn -domain_name_sort(a,b);
+};
+
+function updateCDNNodeData(data) {
+    $('#cdn-node-table').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="dynamic_cdn_nodes"></table>' );
+    var actualEntries = [];
+
+    var rows = data.rows;
+    for (row in rows) {
+        hostname = rows[row]['hostname'];
+        bytes_sent = rows[row]['sum_bytes_sent'];
+        bytes_hit = rows[row]['sum_bytes_hit'];
+        elapsed = rows[row]['sum_elapsed'];
+        healthy = rows[row]['sum_healthy'];
+
+        if (bytes_sent > 0) {
+            hit_ratio = parseInt( bytes_hit * 100.0 / bytes_sent );
+        } else {
+            hit_ratio = 0;
+        }
+
+        Mbps = parseInt(rows[row]['sum_computed_bytes_sent_div_elapsed'] * 8.0 / 1024.0 / 1024.0);
+
+        if (healthy>0) {
+            healthyStr = "ok";
+        } else {
+            healthyStr = "bad";
+        }
+
+        actualEntries.push([hostname, healthyStr, Mbps, hit_ratio]);
+    }
+    oTable = $('#dynamic_cdn_nodes').dataTable( {
+        "bJQueryUI": true,
+        "aaData":  actualEntries,
+        "bStateSave": true,
+        "aoColumns": [
+            { "sTitle": "Hostname", sType: "domain-name" },
+            { "sTitle": "Healthy" },
+            { "sTitle": "Mbps" , sClass: "alignCenter"},
+            { "sTitle": "Hit Ratio" , sClass: "alignCenter"},
+        ],
+    } );
+}
+
+function updateCDNNodes() {
+    var contentProvider = $("#cdn-node-data-slicename").val();
+
+    var filterPart = ""
+    if ((contentProvider!="") && (contentProvider!="all")) {
+         filterPart = "&cp=" + contentProvider
+    }
+
+    var url= '/analytics/bigquery/?event=hpc_heartbeat&sum=@bytes_sent,@bytes_hit,@healthy,@elapsed&computed=@bytes_sent/@elapsed&groupBy=@hostname&cached=hpc&cachedGroupBy=@hostname' + filterPart;
+
+    $.ajax({
+    url: url,
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData)
+    {
+        updateCDNNodeData(newData);
+    }
+});
+    setTimeout(updateCDNNodes, 30000);
+}
+
+google.setOnLoadCallback(function () {
+    $('#cdn-node-data-slicename').change(function()
+    {
+        updateCDNNodes();
+    });
+
+    updateCDNNodes();
+});
+
+//setTimeout(updateCDNNodes, 5000);
+</script>
diff --git a/planetstack/templates/admin/dashboard/cdnoperations.html b/planetstack/templates/admin/dashboard/cdnoperations.html
new file mode 100644 (file)
index 0000000..167b558
--- /dev/null
@@ -0,0 +1,263 @@
+    <div id="HPCDashboard">
+    <h1>CDN Operations View</h1>
+    <span id="hpcSummary">
+        <span class="summary-attr"><b>Allocated Slivers:</b> <span id="active-slivers-value"> </span> </span>
+        <span class="summary-attr"><b>CDN Bandwidth:</b> <span id="overall-throughput-value"> </span>  </span>
+        <span class="summary-attr-util"><b>CDN Load:</b> <span id="cpu-utilization-value"> </span>  </span>
+    </span>
+    <div id="map-us" ></div>
+    <div style="line-height: 30%"><br></div><table border=0><tr>
+    <td>Least Loaded&nbsp;&nbsp;</td>
+    <td bgcolor="#0000FF" width=40>&nbsp;</td>
+    <td bgcolor="#00FFFF" width=40>&nbsp;</td>
+    <td bgcolor="#00FF00" width=40>&nbsp;</td>
+    <td bgcolor="#FFFF00" width=40>&nbsp;</td>
+    <td bgcolor="#FF0000" width=40>&nbsp;</td>
+    <td>&nbsp;&nbsp;Most Loaded</td>
+    </tr></table>
+    </div>
+
+    <div id="confirmNodeAdded" title="Added Node to Site"><p>Added Node to Site</p></div>
+    <div id="confirmNodeRemoved" title="Removed Node from Site"><p>Added Node to Site</p></div>
+
+<script>
+$( "#confirmNodeAdded" ).dialog({ autoOpen: false,
+                    modal: true,
+                    buttons: {
+                        Ok: function() {
+                           $( this ).dialog( "close" );
+                        }
+                    }});
+$( "#confirmNodeRemoved" ).dialog({ autoOpen: false });
+
+L.Map = L.Map.extend({
+    openPopup: function(popup) {
+        this._popup = popup;
+
+        return this.addLayer(popup).fire('popupopen', {
+            popup: this._popup
+        });
+    }
+});
+
+
+//Iterate through data and find the max/min coordinates to include all of our points to start
+var map = L.map('map-us'); //.setView([0, 0], 1);
+map.scrollWheelZoom.disable();
+
+//
+// Great tiles, but starting to occasionally see 403 errors on certain tiles causing grey out effect
+//L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
+//
+// Swapping out cloudmade tiles to openstreetmap - too many grey tiles showing
+L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+    maxZoom: 18,
+    attribution: 'Test'
+}).addTo(map);
+
+var arrayOfLatLngs = [];
+var mapData = {{ cdnData|safe }};
+log.debug( mapData );
+
+for ( var key in mapData ) {
+    arrayOfLatLngs.push([mapData[key]['lat'],mapData[key]['long']]);
+    log.debug( arrayOfLatLngs );
+
+    mapData[key]['marker'] = L.marker([mapData[key]['lat'], mapData[key]['long']], {icon: getIcon(mapData[key]['numNodes'], mapData[key]['numHPCSlivers'], 0, mapData[key]['hot']) });
+    mapData[key]['marker'].addTo(map).bindPopup(setPopupVals(key, mapData[key]));
+
+}
+var bounds = new L.LatLngBounds(arrayOfLatLngs);
+map.fitBounds(bounds);
+
+var popup = L.popup();
+
+
+function setPopupVals (site, siteData) {
+    var retVal = '<span class="SiteDetail"><b>' + site + '</b></span>' +
+                   '</br><a href="' + siteData['siteUrl'] + '">' + siteData['siteUrl'] + '</a>' +
+                   '</br><b>HPC Slivers: </b>' + siteData['numHPCSlivers'] +
+                   '</br><b>Total Nodes: </b>' + siteData['numNodes'] +
+//                   '</br><b>Hot: </b>' + Math.round(siteData['hot']*100) +
+                   '</br><b>Measured Load: </b>' + siteData['load'] + '%' +
+                   '<span id="addSlivers"></br><a href="#" id="addHPCSliver" data-site="' + site + '" data-availNodes="' + siteData['numNodes'] +'">Add HPC Slivers</a> </span>' +
+                   '<span id="remSlivers"><a href="#" id="remHPCSliver" data-site="' + site + '">Remove HPC Slivers</a> </span>';
+
+   return retVal;
+}
+
+$('#map-us').on('click', '#remHPCSliver', function() {
+
+    $.ajax({
+        url : '/dashboardaddorremsliver/',
+        dataType : 'json',
+        data: {site: $(this).data('site'),
+               actionToDo: "rem",
+               csrfmiddlewaretoken: "{{ csrf_token }}",   // < here
+               state:"inactive" },
+        type : 'POST',
+        success:function(){
+            confirmDialog("Info","Removed an HPC Sliver from Site ");
+        },
+        error:function (xhr, textStatus, thrownError){
+            errorDialog("Error", textStatus + " " + xhr.responseText);
+        }
+    });
+});
+
+$('#map-us').on('click', '#addHPCSliver', function() {
+
+    $.ajax({
+        url : '/dashboardaddorremsliver/',
+        dataType : 'json',
+        data: {site: $(this).data('site'),
+               actionToDo: "add",
+               csrfmiddlewaretoken: "{{ csrf_token }}",   // < here
+               state:"inactive" },
+        type : 'POST',
+        success: function(response)
+        {
+            confirmDialog("Info","Added an HPC Sliver to Site ");
+        },
+        error:function (xhr, textStatus, thrownError){
+            errorDialog("Error", textStatus + " " + xhr.responseText);
+        }
+    });
+});
+
+function getIcon(numNodes, numHPCSlivers, currentBW, hot) {
+    //var colorChoices = ["#007FFF", "#0000FF", "#7f00ff", "#FF00FF", "#FF007F", "#FF0000"];
+    var colorChoices = ["#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000"];
+
+    var ratio = hot * 100; //(numHPCSlivers/numNodes) * 100;
+    var numColors = colorChoices.length;
+    var colorBands = 100/numColors;
+
+    //Algorithm for color tone should consider the number of available nodes
+    // on the site, and then how much the current dedicated nodes are impacted
+    //var iconColor = 0;
+    var iconColor = colorChoices.length-1;
+    for (colorBand = 0; colorBand < numColors; colorBand ++) {
+        if (ratio < colorBands * colorBand+1) {
+            iconColor = colorBand
+            break;
+        }
+    }
+
+    if (numHPCSlivers < 1) {
+        iconColor = "#7F7F7F";
+    } else {
+        iconColor = colorChoices[iconColor];
+    }
+
+    var icon = L.MakiMarkers.icon({icon: "star-stroked", color: iconColor , size: "s"});
+    return icon;
+}
+
+function updateMaps() {
+    log.debug("Attempting to update Maps");
+    $.ajax({
+    url : '/hpcdashboard',
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData)
+    {
+        log.debug("Successfully got data back...");
+        log.debug(newData);
+        log.debug("Still have old data too");
+        log.debug(mapData);
+        updateMapData(newData);
+    }
+});
+    setTimeout(updateMaps, 30000)
+
+}
+
+function updateMapData(newData) {
+    for ( site in newData ) {
+        var isNewSite = false;
+        //check to see if the site is new or not
+        if (site in mapData) {
+            log.debug("Site " + site + " already mapped");
+            //take ownership of marker
+            newData[site]['marker'] = mapData[site]['marker'];
+            delete mapData[site];
+            newData[site]['marker'].setIcon(getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers'],  0, newData[site]['hot']));
+            // workaround, markers currently don't have a setPopup Content method -- so have to grab object directly
+            newData[site]['marker']._popup.setContent(setPopupVals(site, newData[site]));
+        }
+        else {
+            isNewSite = true;
+            log.debug("New Site detected: " + site);
+            newData[site]['marker'] = L.marker([newData[site]['lat'], newData[site]['long']],
+                                              {icon: getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers'],  0, newData[site]['hot']) });
+            newData[site]['marker'].addTo(map).bindPopup(setPopupVals(site, newData[site])); //.openPopup();
+            log.debug("Should have added the new site");
+
+        }
+    }
+
+    // Anything still in data needs to be removed since it is no longer a valid site
+    for (remSite in mapData) {
+        log.warn("Site: " + remSite + " is no longer valid, removing from map");
+        map.removeLayer(data[remSite]['marker']);
+    }
+    mapData = newData;
+}
+
+function onMapClick(e) {
+    popup
+    .setLatLng(e.latlng)
+    .setContent("You clicked the map at " + e.latlng.toString())
+    .openOn(map);
+}
+
+setTimeout(updateMaps, 5000)
+
+// from stackexchange
+function setInnerText (elementId, text) {
+    var element;
+    if (document.getElementById) {
+        element = document.getElementById(elementId);
+    } else if (document.all) {
+        element = document.all[elementId];
+    }
+    if (element) {
+        if (typeof element.textContent != 'undefined') {
+            element.textContent = text;
+        } else if (typeof element.innerText != 'undefined') {
+            element.innerText = text;
+        } else if (typeof element.removeChild != 'undefined') {
+            while (element.hasChildNodes()) {
+                element.removeChild(element.lastChild);
+            }
+            element.appendChild(document.createTextNode(text)) ;
+        }
+    }
+}
+
+function updateLabelData(summaryData) {
+    setInnerText("active-slivers-value", summaryData["total_slivers"]);
+    setInnerText("overall-throughput-value", (summaryData["total_bandwidth"]*8/1024/1024/1024).toFixed(2) + " Gbps");
+    setInnerText("cpu-utilization-value", summaryData["average_cpu"] + "%");
+}
+
+function updateLabels() {
+    log.debug("Attempting to update Labels");
+    $.ajax({
+    url : '/hpcsummary',
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData)
+    {
+        updateLabelData(newData);
+    }
+});
+    setTimeout(updateLabels, 30000)
+
+}
+
+setTimeout(updateLabels, 5000)
+
+
+</script>
diff --git a/planetstack/templates/admin/dashboard/customize.html b/planetstack/templates/admin/dashboard/customize.html
new file mode 100644 (file)
index 0000000..d2e8a20
--- /dev/null
@@ -0,0 +1,93 @@
+<form>
+    <div class="customize_row">\r
+    <div class="customize_column">\r
+    <div>Available Dashboard Views</div>\r
+    <select name="selectfrom" id="select-from" multiple size="5">\r
+        {% for cp in unusedDashboards %}\r
+           <option value="{{ cp }}">{{ cp }}</option>
+        {% endfor %}\r
+    </select>\r
+    </div>\r
+    <div class="customize_column">\r
+    <br>\r
+    <div class="btn btn-success" id="customize-btn-add">Add &raquo;</div><br><br>\r
+    <div class="btn btn-success" id="customize-btn-remove">&laquo; Remove</div>\r
+    </div>\r
+    <div class="customize_column">\r
+    <div>Selected Dashboard Views</div>\r
+    <select name="selectto" id="select-to" multiple size="5">\r
+        {% for cp in dashboards %}\r
+           <option value="{{ cp }}">{{ cp }}</option>
+        {% endfor %}\r
+    </select>\r
+    <br>\r
+    <div class="btn btn-high btn-info" id="customize-btn-save">Save</div>\r
+    <div style="display: none" id="customize-msg-saving">Saving...</div>\r
+    </div>\r
+    <div class="customize_column">\r
+    <br>\r
+    <div class="btn btn-success" id="customize-btn-up">Up</div><br><br>\r
+    <div class="btn btn-success" id="customize-btn-down">Down</div>\r
+    </div>\r
+    </div>\r
+</form>\r
+
+<script>
+$(document).ready(function() {
+    $('#customize-btn-add').click(function(){\r
+        $('#select-from option:selected').each( function() {\r
+                $('#select-to').append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>");\r
+            $(this).remove();\r
+        });\r
+    });\r
+    $('#customize-btn-remove').click(function(){\r
+        $('#select-to option:selected').each( function() {\r
+            $('#select-from').append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>");\r
+            $(this).remove();\r
+        });\r
+    });\r
+    $('#customize-btn-up').bind('click', function() {\r
+        $('#select-to option:selected').each( function() {\r
+            var newPos = $('#select-to option').index(this) - 1;\r
+            if (newPos > -1) {\r
+                $('#select-to option').eq(newPos).before("<option value='"+$(this).val()+"' selected='selected'>"+$(this).text()+"</option>");\r
+                $(this).remove();\r
+            }\r
+        });\r
+    });\r
+    $('#customize-btn-down').bind('click', function() {\r
+        var countOptions = $('#select-to option').size();\r
+        $('#select-to option:selected').each( function() {\r
+            var newPos = $('#select-to option').index(this) + 1;\r
+            if (newPos < countOptions) {\r
+                $('#select-to option').eq(newPos).after("<option value='"+$(this).val()+"' selected='selected'>"+$(this).text()+"</option>");\r
+                $(this).remove();\r
+            }\r
+        });\r
+    });\r
+    $('#customize-btn-save').bind('click', function() {\r
+         $("#customize-btn-save").hide();\r
+         $("#customize-msg-saving").show();\r
+         var items=[];\r
+         $("#select-to option").each(function() { items.push($(this).val()); });\r
+         $.ajax({\r
+                url: '/customize/',
+                dataType: 'json',
+                data: {
+                        dashboards: items.join(","),
+                       csrfmiddlewaretoken: "{{ csrf_token }}" // < here
+                },
+                type: 'POST',
+                error: function (jqXHR, textStatus, errorThrown) {
+                    errorDialog("Error", textStatus + " " + jqXHR.responseText);
+                    $("#customize-btn-save").show();
+                    $("#customize-msg-saving").hide();
+                },
+                success: function () {
+                        location.reload();
+                }
+        });\r
+    });
+});
+</script>
+
diff --git a/planetstack/templates/admin/dashboard/dashboard_base.html b/planetstack/templates/admin/dashboard/dashboard_base.html
new file mode 100644 (file)
index 0000000..903f3fd
--- /dev/null
@@ -0,0 +1,91 @@
+{% extends "admin/base.html" %}
+{% load admin_static %}
+
+{% block extrahead %}
+<link rel="stylesheet"  href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables.css">
+<link rel="stylesheet" type="text/css" href="{% static 'suit/css/suit.css' %}" media="all">
+<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables_themeroller.css">
+<link rel="stylesheet" type="text/css" href="{% static 'planetstack.css' %}" media="all">
+<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
+<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
+<script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
+
+
+<!-- no need to include jquery here as it's already included by base.html. Including it multiple times will break mtuity statistics. -->
+<!-- src="http://code.jquery.com/jquery-1.9.1.js" -->
+
+<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
+<script src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
+<script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
+<script src="{% static 'js/Leaflet.MakiMarkers.js' %}" > </script>
+  
+<script>
+  $(function() {
+    $( "#hometabs" ).tabs({active: 0, //event: "mouseover"
+      //collapsible: true
+    });
+  });
+
+var consoleAppender = new log4javascript.BrowserConsoleAppender();
+var patternLayout = new log4javascript.PatternLayout("%d{HH:mm:ss,SSS} %l{s:l} %-5p - %m{1}%n");
+consoleAppender.setLayout(patternLayout);
+//var log  = log4javascript.getDefaultLogger();
+var log  = log4javascript.getRootLogger();
+log.addAppender(consoleAppender);
+log.setLevel(log4javascript.Level.ERROR);
+
+function confirmDialog(title,msg) {
+    var dialog = $('<div>'+msg+'</div>');
+    var def = $.Deferred();
+
+    $(dialog).dialog({
+        resizable: false,
+        title: title,
+        autoOpen: true,
+        modal: true,
+        dialogClass: "dashboard-hpc-sliver",
+        buttons: {
+            'OK': function() {
+                def.resolve();
+                log.debug("Chose to add a sliver");
+                $( this ).dialog( "close" );
+            },
+            'Cancel': function() {
+                def.reject();
+                $( this ).dialog( "close" );
+            }
+        },
+        close: {
+        }
+    });
+    return def.promise();
+}
+
+function errorDialog(title,msg) {
+    var dialog = $('<div>'+msg+'</div>');
+    var def = $.Deferred();
+
+    $(dialog).dialog({
+        resizable: false,
+        title: title,
+        autoOpen: true,
+        modal: true,
+        dialogClass: "dashboard-hpc-sliver",
+        buttons: {
+            'OK': function() {
+                def.resolve();
+                $( this ).dialog( "close" );
+            },
+        },
+        close: {
+        }
+    });
+    return def.promise();
+}
+
+</script>
+{% endblock %}
+
+{% block content %}
+dashboard goes here
+{% endblock %}
diff --git a/planetstack/templates/admin/dashboard/developer.html b/planetstack/templates/admin/dashboard/developer.html
new file mode 100644 (file)
index 0000000..00c49c7
--- /dev/null
@@ -0,0 +1,84 @@
+<div id="developerview"></div>
+
+<script>
+var oTable;
+
+function updateUserSliceTable(){
+    log.debug("Should grab user slice info");
+    jQuery.ajax({
+        async:true,
+        dataType: 'json',
+        url: '/hpcdashuserslices',
+        success: function(data){
+            log.info("Got Data back for User SliceTable");
+            //parseData(data);
+            //createUserSliceTable(data);
+            setTimeout(function () { updateUserSliceTable() }, 5000);
+        },
+        error: function(data){
+            log.debug("COULDNT GET DATA BACK");
+            setTimeout(function () { updateUserSliceTable() }, 5000);
+        }
+    });
+}
+
+function createUserSliceTable(data) {
+    log.debug("Creating User Slice Table");
+
+    //Add check for #dynamicusersliceinfo_filter label-> input having focus here
+
+    $('#developerview').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="dynamicusersliceinfo"></table>' );
+    var actualEntries = [];
+    log.debug(data['userSliceInfo']['rows'][0]['slicename']);
+
+    var rows = data['userSliceInfo']['rows'];
+    for (row in rows) {
+        log.debug(row[0]);
+        slicename = rows[row]['slicename'];
+        sliceid = rows[row]['sliceid'];
+        role = rows[row]['role'];
+        slivercount = rows[row]['slivercount'];
+        sitecount = rows[row]['sitecount'];
+        actualEntries.push(['<a href="http://{{request.get_host}}/admin/core/slice/' + sliceid + '">' + slicename + '</a>',
+                            role, slivercount, sitecount]);
+    }
+    oTable = $('#dynamicusersliceinfo').dataTable( {
+        "bJQueryUI": true,
+        "aaData":  actualEntries ,
+        "bStateSave": true,
+        "aoColumns": [
+            { "sTitle": "Slice" },
+            { "sTitle": "Privilege" , sClass: "alignCenter"},
+            { "sTitle": "Number of Slivers" , sClass: "alignCenter"},
+            { "sTitle": "Number of Sites" , sClass: "alignCenter"},
+        ]
+    } );
+
+    // If the filter had focus, reapply here
+
+    setTimeout(function() {
+       jQuery.ajax({
+           url: '/hpcdashuserslices',
+           dataType: 'json',
+           success: function(data){ createUserSliceTable(data); },
+           complete: function(){ },
+       });
+    },  10000);
+}
+
+function initTable(){
+    log.debug("Initializing Table")
+    jQuery.ajax({
+        url: '/hpcdashuserslices',
+        dataType: 'json',
+        success: function(data){ createUserSliceTable(data); },
+        complete: function(){
+        }
+    });
+    updateUserSliceTable();
+}
+
+
+initTable();
+
+</script>
diff --git a/planetstack/templates/admin/dashboard/hpc_historical.html b/planetstack/templates/admin/dashboard/hpc_historical.html
new file mode 100644 (file)
index 0000000..2e3b85e
--- /dev/null
@@ -0,0 +1,303 @@
+
+    <script type="text/javascript" src="//www.google.com/jsapi"></script>
+    <link rel="stylesheet" href="/static/hpc_historical.css">
+    <script type="text/javascript">
+               google.load('visualization', '1', {'packages' : ['controls','table','corechart','geochart']});
+    </script>
+
+    <script type="text/javascript">
+
+     var options = {
+\r         width: 600,
+         height: 400,
+         showRowNumber: false,
+         pages: true,
+         numRows: 9,
+         backgroundColor: "black"
+     };
+
+     // ask django for a data source URL to use for the graphs
+
+     function updateDataSourceUrl() {
+         var sliceName = $("#historical_slicename :selected").text();
+         var queryString = "/analytics/bigquery/?timeBucket=600&maxAge=86400&sum=@bytes_sent&avg=@cpu&groupBy=Time,city,@hostname,@site&slice=" + sliceName;
+
+         $( "#control1").html("");
+         $( "#control2").html("");
+         $( "#chart-site-agg" ).html("<div class='loading'>Loading ...</div>");
+         $( "#chart-site-time" ).html("");
+         $( "#chart-geo" ).html("");
+
+         $.ajax({
+             url: queryString,
+             dataType: 'json',
+             type: 'GET',
+             success: function (newData) {
+                 sendAndDraw(newData["dataSourceUrl"])
+             }
+         });
+     }
+
+     TIME_COL = 0;
+     BANDWIDTH_COL = 2;
+     CPU_COL = 1;
+     CITY_COL = 3;
+     NODE_COL = 4;
+     SITE_COL = 5;
+
+     google.setOnLoadCallback(function () {
+         $('#historical_slicename').change(function()
+         {
+             updateDataSourceUrl();
+         });
+
+         updateDataSourceUrl();
+     });
+
+     function showSiteTimeAgg(dt) {
+         var lineChart = new google.visualization.ChartWrapper({
+             'chartType': 'LineChart',
+             'containerId': 'chart-site-time',
+             'options': {
+                 'width': 320,
+                 'height': 300,
+                 'title': 'Network-wide usage',
+                 'pages': true,
+                 'numRows': 9
+             },
+             'view': {
+                 'columns': [0, 1, 2]
+             }
+         });
+         lineChart.setDataTable(dt);
+         lineChart.draw();
+     }
+
+     function showSiteAgg(dt) {
+         var barChart = new google.visualization.ChartWrapper({
+             'chartType': 'ColumnChart',
+             'containerId': 'chart-site-agg',
+             'options': {
+                 'width': 670,
+                 'height': 300,
+                 'title': 'Site-wise usage',
+                 'pages': true,
+                 'numRows': 9
+             },
+             'view': {
+                 'columns': [1, 2, 3]
+             }
+         });
+         barChart.setDataTable(dt);
+         barChart.draw();
+         var geoChart = new google.visualization.ChartWrapper({
+             'chartType': 'GeoChart',
+             'containerId': 'chart-geo',
+             'options': {
+                 'width': 320,
+                 'height': 300,
+                 'displayMode': 'markers',
+                 'region': '021',
+                 'title': 'Usage map',
+                 colorAxis: {
+                     colors: ['green', 'purple', 'red']
+                 }
+             },
+             'view': {
+                 'columns': [0, 2, 3]
+             }
+         });
+         geoChart.setDataTable(dt);
+         geoChart.draw();
+     }
+
+     function handleResponse(response) {
+         var timeSlider = new google.visualization.ControlWrapper({
+             'controlType': 'DateRangeFilter',
+             'containerId': 'control1',
+             'options': {
+                 'filterColumnLabel': 'Time',
+                 ui: {
+                     ticks: 10,
+                     step: "minute"
+                 }
+             }
+         });
+
+         var categoryPicker = new google.visualization.ControlWrapper({
+             'controlType': 'CategoryFilter',
+             'allowMultiple': true,
+             'containerId': 'control2',
+             'options': {
+                 'filterColumnLabel': 'site',
+                 'ui': {
+                     'labelStacking': 'vertical',
+                     'allowTyping': false
+                 }
+             }
+         });
+
+         var proxy = new google.visualization.ChartWrapper({
+             'chartType': 'Table',
+             'containerId': 'chart7',
+             'options': {
+                 'width': 800,
+                 'height': 300,
+                 pageSize: 5,
+                 page: 'enable',
+                 'legend': 'none',
+                 'title': 'Nodes'
+             },
+             'view': {
+                 'columns': [0, 1, 2, 3, 4, 5]
+             }
+         });
+
+         function avg_bandwidth(arr) {
+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]*8.0/1024.0/1024.0/1024.0;
+                }
+                if (arr.length==0) {
+                    return 0;
+                }
+                return ret/arr.length;
+         }
+
+         function sum_bytes_sent_as_bw(arr) {
+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]*8.0/1024.0/1024.0/1024.0;
+                }
+                return ret/60.0;
+         }
+
+         function sum_bytes_sent_as_GB(arr) {
+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]/1024.0/1024.0/1024.0;
+                }
+                return ret;
+         }
+
+         function fixDate2(unixDate) {
+             // not completely sure why we have to do this, as the data was in
+             // javascript Date() objects to start with. If we don't do it,
+             // then the horizontal axis will be blank.
+             return new Date(unixDate);
+         }
+
+         var format0dp = new google.visualization.NumberFormat({fractionDigits:0});
+         var format2dp = new google.visualization.NumberFormat({fractionDigits:2});
+
+         if (response.isError()) {
+             $( "#chart-site-agg" ).html("<div class='loading'>Error while fetching data.</div>");
+             return;
+         }
+
+         if (response.getDataTable().getNumberOfRows() == 0) {
+             $( "#chart-site-agg" ).html("<div class='loading'>No data for this slice.</div>");
+             return;
+         }
+
+         // Create a group for charts that will have a horizontal axis that is
+         // time.
+
+         google.visualization.events.addListener(proxy, 'ready', function () {
+             var dt = proxy.getDataTable();
+             var groupedData1 = google.visualization.data.group(dt, [{
+                 column: TIME_COL,
+                 type: 'datetime',
+                 modifier: fixDate2,
+             }], [{
+                 column: CPU_COL,
+                 type: 'number',
+                 label: "avg cpu",
+                 aggregation: google.visualization.data.avg
+             }, {
+                 column: BANDWIDTH_COL,
+                 type: 'number',
+                 label: "Gbps",
+                 aggregation: sum_bytes_sent_as_bw
+             }]);
+
+             format0dp.format(groupedData1,1);
+             format2dp.format(groupedData1,2);
+
+             showSiteTimeAgg(groupedData1);
+         });
+
+         // Create a group for charts that will have a horizontal axis that is
+         // city or site.
+
+         google.visualization.events.addListener(proxy, 'ready', function () {
+             var dt = proxy.getDataTable();
+             var groupedData0 = google.visualization.data.group(dt, [CITY_COL, SITE_COL], [{
+                 column: CPU_COL,
+                 type: 'number',
+                 label: 'avg cpu',
+                 aggregation: google.visualization.data.avg
+             }, {
+                 column: BANDWIDTH_COL,
+                 type: 'number',
+                 label: "GB sent",
+                 aggregation: sum_bytes_sent_as_GB
+             }]);
+
+             format0dp.format(groupedData0,2);
+             format2dp.format(groupedData0,3);
+
+             showSiteAgg(groupedData0);
+         });
+
+         data = response.getDataTable();
+         new google.visualization.Dashboard(document.getElementById('dashboard')).
+         // Establish bindings, declaring the both the slider and the category
+         // picker will drive both charts.
+         bind([categoryPicker, timeSlider], [proxy]).
+         // Draw the entire dashboard.
+         draw(data);
+
+     }
+
+     function sendAndDraw(queryString) {
+         query = new google.visualization.Query(queryString)
+         query && query.abort();
+         query.send(function (response) {
+             handleResponse(response);
+         });
+     }
+
+    </script>
+    <div id="dashboard" class="graph_container">
+                <div class="row">
+                        <span><b>Slice Name:</b></span>
+                        <span><select id="historical_slicename">
+                        {% for slice in userSliceInfo %}
+                           <option value="{{ slice.slicename }}">{{ slice.slicename }}</option>
+                        {% endfor %}
+                        </select></span>
+                </div>
+               <div class="row" dstyle="background-color:red">
+                       <div class="col-md-12">
+                               <div class="col-md-4" id="control2"></div>
+                               <div class="col-md-4" id="control1"></div>
+                               <!--<div class="col-md-4" id="control3"></div>-->
+                       </div>
+               </div>
+               <div class="row" dstyle="background-color:green">
+                       <div class="col-md-12">
+                               <div class="col-md-fullgraph" id="chart-site-agg" dstyle="background-color:pink">
+                               </div>
+                       </div>
+               </div>
+               <div class="row" dstyle="background-color:blue">
+                       <div class="col-md-12">
+                               <div class="col-md-halfgraph" id="chart-site-time" dstyle="background-color:orange">
+                               </div>
+                               <div class="col-md-halfgraph" id="chart-geo" dstyle="background-color:yellow">
+                               </div>
+                       </div>
+               </div>
+    </div>
+       <div id="chart7" style="display:none"></div>
diff --git a/planetstack/templates/admin/dashboard/slice_interactions.html b/planetstack/templates/admin/dashboard/slice_interactions.html
new file mode 100644 (file)
index 0000000..3ddaa1f
--- /dev/null
@@ -0,0 +1,503 @@
+<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
+<style>
+#slice_interaction_chart_placeholder {
+    text-align: center;
+    color:#fff;
+    position: relative;
+    height: 100%;
+    width: 100%;
+}
+.dependencyWheel {
+    font: 10px sans-serif;
+}
+form .btn-primary {
+    margin-top: 25px;
+}
+.labeltext {
+    color: #fff;
+}
+#circle circle {
+    fill: none;
+    pointer-events: all;
+}
+path.chord {
+    stroke: #000;
+    stroke-width: .10px;
+    transition: opacity 0.3s;
+}
+#circle:hover path.fade {
+    opacity: 0;
+}
+a {
+    text-decoration: none;
+    border-bottom: 1px dotted #666;
+    color: #999;
+}
+.more a {
+    color: #666;
+}
+.by a {
+    color: #fff;
+}
+a:hover {
+    color: #45b8e2;
+}
+a:not(:hover) {
+    text-decoration: none;
+}
+text {
+    fill: black;
+}
+svg {
+    font-size: 12px;
+    font-weight: bold;
+    color: #999;
+    font-family:'Arial', sans-serif;
+    min-height: 100%;
+    min-width: 100%;
+}
+button:disabled {
+    color:red;
+    background-color: lightyellow;
+}
+.sliceinteractions_column {
+  display: table-cell;\r
+  padding: 10px;\r
+}
+#interactions_function {
+  width: 125px;
+}
+
+</style>
+
+<div class="row">
+    <div class="sliceinteractions_column">
+    <select id="interactions_function">
+        <option value="networks">networks</option>
+        <option value="users">users</option>
+        <option value="owner sites">sites</option>
+        <option value="sliver_sites">sliver_sites</option>
+        <option value="sliver_nodes">sliver_nodes</option>
+    </select>
+    </div>
+    <div class="sliceinteractions_column">
+    <h3 id="sliceEngagementTitle">Slice Interactions</h3>
+    </div>
+</div>
+
+<div id="slice_interaction_chart_placeholder"></div>
+
+<script>
+
+// Chord Diagram for showing Collaboration between users found in an anchor query
+// Collaboration View
+//
+
+var width = 600,
+    height = 600,
+    outerRadius = Math.min(width, height) / 2 - 100,
+    innerRadius = outerRadius - 18;
+
+//create number formatting functions
+var formatPercent = d3.format("%");
+var numberWithCommas = d3.format("0,f");
+
+//define the default chord layout parameters
+//within a function that returns a new layout object;
+//that way, you can create multiple chord layouts
+//that are the same except for the data.
+function getDefaultLayout() {
+    return d3.layout.chord()
+    .sortSubgroups(d3.descending)
+    .sortChords(d3.ascending);
+}
+var last_layout; //store layout between updates
+var g;
+var arc;
+var path;
+
+function init_visualization() {
+    arc = d3.svg.arc()
+        .innerRadius(innerRadius)
+        .outerRadius(outerRadius);
+
+    path = d3.svg.chord()
+        .radius(innerRadius);
+
+
+    /*** Initialize the visualization ***/
+    g = d3.select("#slice_interaction_chart_placeholder").append("svg")
+            .attr("width", width)
+            .attr("height", height)
+        .append("g")
+            .attr("id", "circle")
+            .attr("transform",
+                  "translate(" + width / 2 + "," + height / 2 + ")");
+    //the entire graphic will be drawn within this <g> element,
+    //so all coordinates will be relative to the center of the circle
+
+    g.append("circle")
+        .attr("r", outerRadius);
+}
+
+$( document ).ready(function() {
+    init_visualization();
+    $('#interactions_function').change(function() {
+         updateInteractions();
+     });
+    updateInteractions();
+});
+
+function updateInteractions() {
+ $( "#sliceEngagementTitle" ).html("<h3>Loading...</h3>");
+ $.ajax({
+    url : "/admin/sliceinteractions/" + $("#interactions_function :selected").text() + "/",
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData)
+    {
+        $( "#sliceEngagementTitle" ).html("<h3>" + newData["title"] + "</h3>");
+        updateChords(newData["groups"], newData["matrix"], newData["objectName"])
+    }
+   });
+}
+
+
+/* Create OR update a chord layout from a data matrix */
+function updateChords( users, matrix, objectName ) {
+
+    /* Compute chord layout. */
+    layout = getDefaultLayout(); //create a new layout object
+    layout.matrix(matrix);
+    /* Create/update "group" elements */
+    var groupG = g.selectAll("g.group")
+        .data(layout.groups(), function (d) {
+            return d.index; 
+            //use a key function in case the 
+            //groups are sorted differently between updates
+        });
+    
+    groupG.exit()
+        .transition()
+            .duration(1500)
+            .attr("opacity", 0)
+            .remove(); //remove after transitions are complete
+
+    var newGroups = groupG.enter().append("g")
+        .attr("class", "group");
+    //the enter selection is stored in a variable so we can
+    //enter the <path>, <text>, and <title> elements as well
+
+    
+    //Create the title tooltip for the new groups
+    newGroups.append("title");
+    
+    //Update the (tooltip) title text based on the data
+    groupG.select("title")
+        .text(function(d, i) {
+            return "Slice (" + users[i].name +
+                ") "
+                ;
+        });
+
+    //create the arc paths and set the constant attributes
+    //(those based on the group index, not on the value)
+    newGroups.append("path")
+        .attr("id", function (d) {
+            return "group" + d.index;
+            //using d.index and not i to maintain consistency
+            //even if groups are sorted
+        })
+        .style("fill", function (d) {
+            return users[d.index].color;
+        });
+    
+    //update the paths to match the layout
+    groupG.select("path") 
+        .transition()
+            .duration(1500)
+            .attr("opacity", 0.5) //optional, just to observe the transition
+        .attrTween("d", arcTween( last_layout ))
+       //     .transition().duration(100).attr("opacity", 1) //reset opacity
+        ;
+    
+    //create the group labels
+    newGroups.append("svg:text")
+        .attr("xlink:href", function (d) {
+            return "#group" + d.index;
+        })
+        .attr("dy", ".35em")
+        .attr("color", "#fff")
+        .text(function (d) {
+            return users[d.index].name;
+        });
+
+    //position group labels to match layout
+    groupG.select("text")
+        .transition()
+            .duration(1500)
+            .attr("transform", function(d) {
+                d.angle = (d.startAngle + d.endAngle) / 2;
+                //store the midpoint angle in the data object
+                
+                return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")" +
+                    " translate(" + (innerRadius + 26) + ")" + 
+                    (d.angle > Math.PI ? " rotate(180)" : " rotate(0)"); 
+                //include the rotate zero so that transforms can be interpolated
+            })
+            .attr("text-anchor", function (d) {
+                return d.angle > Math.PI ? "end" : "begin";
+            });
+    
+    
+    /* Create/update the chord paths */
+    var chordPaths = g.selectAll("path.chord")
+        .data(layout.chords(), chordKey );
+            //specify a key function to match chords
+            //between updates
+        
+    
+    //create the new chord paths
+    var newChords = chordPaths.enter()
+        .append("path")
+        .attr("class", "chord");
+    
+    // Add title tooltip for each new chord.
+    newChords.append("title");
+    
+    // Update all chord title texts
+    chordPaths.select("title")
+        .text(function(d) {
+            if (users[d.target.index].name !== users[d.source.index].name) {
+                return [numberWithCommas(d.source.value),
+                        " " + objectName + " in common between \n",
+                        users[d.source.index].name,
+                        " and ",
+                        users[d.target.index].name,
+                        "\n"
+                        ].join("");
+                    //joining an array of many strings is faster than
+                    //repeated calls to the '+' operator,
+                    //and makes for neater code!
+            }
+            else { //source and target are the same
+                return numberWithCommas(d.source.value)
+                    + " " + objectName + " are only in Slice ("
+                    + users[d.source.index].name + ")";
+            }
+        });
+
+    //handle exiting paths:
+    chordPaths.exit().transition()
+        .duration(1500)
+        .attr("opacity", 0)
+        .remove();
+
+    //update the path shape
+    chordPaths.transition()
+        .duration(1500)
+        //.attr("opacity", 0.5) //optional, just to observe the transition
+        .style("fill", function (d) {
+            return users[d.source.index].color;
+        })
+        .attrTween("d", chordTween(last_layout))
+        //.transition().duration(100).attr("opacity", 1) //reset opacity
+    ;
+
+    // XXX SMBAKER: The way the text was added with newGroups, it's only
+    //   computed when a node is created. This is a problem if we redraw the
+    //   graph with a different set of nodes, because the old labels will
+    //   stick. So, I added this, which *seems* to cause the labels to be
+    //   recomputed.
+    groupG.selectAll("text")
+        .text(function (d) {
+            return users[d.index].name;
+        });
+
+    //add the mouseover/fade out behaviour to the groups
+    //this is reset on every update, so it will use the latest
+    //chordPaths selection
+    groupG.on("mouseover", function(d) {
+        chordPaths.classed("fade", function (p) {
+            //returns true if *neither* the source or target of the chord
+            //matches the group that has been moused-over
+            return ((p.source.index != d.index) && (p.target.index != d.index));
+        });
+    });
+    //the "unfade" is handled with CSS :hover class on g#circle
+    //you could also do it using a mouseout event:
+    /*
+    g.on("mouseout", function() {
+        if (this == g.node() )
+            //only respond to mouseout of the entire circle
+            //not mouseout events for sub-components
+            chordPaths.classed("fade", false);
+    });
+    */
+
+    // XXX smbaker: there's a bug where if you hilight a slice of the chord
+    //   graph, and then update the data, the freshly drawn graph is missing
+    //   some of the chords. Flipping the fade bit seems to fix that.
+    chordPaths.classed("fade", true);
+    chordPaths.classed("fade", false);
+
+    last_layout = layout; //save for next update
+    
+//  }); //end of d3.json
+}
+
+function arcTween(oldLayout) {
+    //this function will be called once per update cycle
+    
+    //Create a key:value version of the old layout's groups array
+    //so we can easily find the matching group 
+    //even if the group index values don't match the array index
+    //(because of sorting)
+    var oldGroups = {};
+    if (oldLayout) {
+        oldLayout.groups().forEach( function(groupData) {
+            oldGroups[ groupData.index ] = groupData;
+        });
+    }
+    
+    return function (d, i) {
+        var tween;
+        var old = oldGroups[d.index];
+        if (old) { //there's a matching old group
+            tween = d3.interpolate(old, d);
+        }
+        else {
+            //create a zero-width arc object
+            var emptyArc = {startAngle:d.startAngle,
+                            endAngle:d.startAngle};
+            tween = d3.interpolate(emptyArc, d);
+        }
+        
+        return function (t) {
+            return arc( tween(t) );
+        };
+    };
+}
+
+function chordKey(data) {
+    return (data.source.index < data.target.index) ?
+        data.source.index  + "-" + data.target.index:
+        data.target.index  + "-" + data.source.index;
+    
+    //create a key that will represent the relationship
+    //between these two groups *regardless*
+    //of which group is called 'source' and which 'target'
+}
+function chordTween(oldLayout) {
+    //this function will be called once per update cycle
+    
+    //Create a key:value version of the old layout's chords array
+    //so we can easily find the matching chord 
+    //(which may not have a matching index)
+    
+    var oldChords = {};
+    
+    if (oldLayout) {
+        oldLayout.chords().forEach( function(chordData) {
+            oldChords[ chordKey(chordData) ] = chordData;
+        });
+    }
+    
+    return function (d, i) {
+        //this function will be called for each active chord
+        
+        var tween;
+        var old = oldChords[ chordKey(d) ];
+        if (old) {
+            //old is not undefined, i.e.
+            //there is a matching old chord value
+            
+            //check whether source and target have been switched:
+            if (d.source.index != old.source.index ){
+                //swap source and target to match the new data
+                old = {
+                    source: old.target,
+                    target: old.source
+                };
+            }
+            
+            tween = d3.interpolate(old, d);
+        }
+        else {
+            //create a zero-width chord object
+/*          XXX SMBAKER: the code commented out below was causing an error,
+                  so I replaced it with the following code from stacktrace
+            if (oldLayout) {
+                var oldGroups = oldLayout.groups().filter(function(group) {
+                        return ( (group.index == d.source.index) ||
+                                 (group.index == d.target.index) )
+                    });
+                old = {source:oldGroups[0],
+                           target:oldGroups[1] || oldGroups[0] };
+                    //the OR in target is in case source and target are equal
+                    //in the data, in which case only one group will pass the
+                    //filter function
+
+                if (d.source.index != old.source.index ){
+                    //swap source and target to match the new data
+                    old = {
+                        source: old.target,
+                        target: old.source
+                    };
+                }
+            }
+            else old = d;
+
+            var emptyChord = {
+                source: { startAngle: old.source.startAngle,
+                         endAngle: old.source.startAngle},
+                target: { startAngle: old.target.startAngle,
+                         endAngle: old.target.startAngle}
+            };
+            tween = d3.interpolate( emptyChord, d );*/
+
+            //create a zero-width chord object
+            var emptyChord = {\r
+                source: { startAngle: d.source.startAngle,\r
+                         endAngle: d.source.startAngle},\r
+                target: { startAngle: d.target.startAngle,\r
+                         endAngle: d.target.startAngle}\r
+            };\r
+            tween = d3.interpolate( emptyChord, d );
+        }
+
+        return function (t) {
+            //this function calculates the intermediary shapes
+            return path(tween(t));
+        };
+    };
+}
+
+
+/* Activate the buttons and link to data sets */
+d3.select("#ReadersButton").on("click", function () {
+    updateChords( "#readinfo" );
+    //replace this with a file url as appropriate
+    
+    //enable other buttons, disable this one
+    disableButton(this);
+});
+
+d3.select("#ContributorsButton").on("click", function() {
+    updateChords( "#contributorinfo" );
+    disableButton(this);
+});
+
+d3.select("#AllUsersButton").on("click", function() {
+    updateChords( "#allinfo" );
+    disableButton(this);
+});
+function disableButton(buttonNode) {
+    d3.selectAll("button")
+        .attr("disabled", function(d) {
+            return this === buttonNode? "true": null;
+        });
+}
+
+</script>
diff --git a/planetstack/templates/admin/dashboard/tenant.html b/planetstack/templates/admin/dashboard/tenant.html
new file mode 100644 (file)
index 0000000..bf49471
--- /dev/null
@@ -0,0 +1,586 @@
+<!doctype html>
+<script type="text/javascript" src="http://www.google.com/jsapi"></script>
+<div id="dialog-form" title="Add/Remove Slivers" style="display: none;">
+       <form>
+               <fieldset>
+                       <label for="numberOfSlivers">Number of Slivers</label>
+                       <input type="text" name="numberOfSlivers" id="numOfSlivers" class="text ui-widget-content ui-corner-all">
+                       <div id=basic-tooltip>Please enter number of slivers</div>
+               </fieldset>
+       </form>
+</div>
+<div id="adv-dialog-form" title="Add/Remove Slivers" style="display: none;">
+       <form>
+               <fieldset>
+                       <label for="numberOfSlivers">Number of Slivers</label>
+                       <input type="text" name="numberOfSlivers" id="advNumOfSlivers" class="text ui-widget-content ui-corner-all">
+                       <div id=adv-tooltip>Please enter number of slivers</div>
+               </fieldset>
+       </form>
+</div>
+<div id="create-slice-form" title="Create New Slice" style="display: none;">
+       <form>
+               <fieldset>
+                       <div class="create-slice-row">
+                               <label for="new-slice-name">Name</label>
+                               <input type="text" name="new-slice-name" id="new-slice-name">
+                       </div>
+                       <div class="create-slice-row">
+                               <label for="new-service-class">Service Class</label>
+                               <select id="new-service-class" class="tenant-create-slice"></select>
+                       </div>
+                       <div class="create-slice-row">
+                               <label for="new-image">Image</label>
+                               <select id="new-image" class="tenant-create-slice"></select>
+                       </div>
+                       <div class="create-slice-row">
+                                <label for="new-network">Network Ports</label>
+                               <input type="text" name="new-network" id="new-network">
+                        </div>
+                       <div class="create-slice-row">
+                               <label for="private-vol">Include Private Vol</label>
+                               <input type="checkbox" name="checkbox" id="private-vol" value="value">
+                       </div>
+                       <div class="create-slice-row">
+                                <label for="mount-data-sets">Data Sets</label>
+                                <select id="mount-data-sets" class="tenant-create-slice"></select>
+                        </div>
+                       <div class="create-slice-row">
+                                <label for="number-of-slivers">Number Of Slivers</label>
+                                <input type="text" name="number-of-slivers" id="number-of-slivers">
+                        </div>
+                       <div id=tooltip>Slice Name cannot be empty</div>
+               </fieldset>
+       </form>
+</div>
+<div id="delete-slice-form" title="Delete a  Slice" style="display: none;">
+       <form>
+               <fieldset>
+                       <div class="create-slice-row">
+                               <label for="delete-slice">Choose a Slice</label>
+                               <select id="delete-slice"></select>
+                       </div>
+               </fieldset>
+       </form>
+</div>
+<script type="text/javascript">
+       google.load('visualization', '1', {
+               'packages': ['controls', 'table', 'corechart', 'geochart']
+       });
+       </script>
+       <script>
+       $(document).ready(function () {
+               function showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) {
+                       $("#service-level-value").empty();
+                       $("#slice-image-value").empty();
+                       $("#tenantSiteTable").empty();
+                       $('#tenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="tenantSiteTableData"></table>');
+                       $("#tenantSliceDropDown").val(value);
+                       var siteNames = [];
+                       var sliverCount;
+                       for (row in rows) {
+                               if (rows[row]['sliceName'] == value) {
+                                       sliceImageData = rows[row]['preferredImage'];
+                                       $("#slice-image-value").html(sliceImageData);
+                                       serviceLevelDataBasic = rows[row]['sliceServiceClass'];
+                                       $("#service-level-value").html(serviceLevelDataBasic);
+                                       var innerRows = rows[row]['sliceSite'];
+                                       for (innerRow in innerRows) {
+                                               sliverCount = innerRows[innerRow];
+                                               siteNames.push([innerRow, sliverCount]);
+                                       }
+                               }
+                       }
+                       oTable = $('#tenantSiteTableData').dataTable({
+                               "bJQueryUI": true,
+                               "bFilter": false,
+                               "bInfo": false,
+                               "bLengthChange": false,
+                               "aaData": siteNames,
+                               "bStateSave": true,
+                               "aoColumns": [{
+                                               "sTitle": "Site Name"
+                                       }, {
+                                               "sTitle": "Allocated",
+                                               sClass: "alignCenter"
+                                       }
+                               ]
+                       });
+                               $('#tenantSliceDropDown').on('change', function () {
+                                       var value = $("#tenantSliceDropDown").val();
+       //alert(value);
+                                       checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet);
+                               });
+               }
+
+               function downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value){
+                        $("#download-details").unbind().click(function(){
+                                                function download(filename, text) {
+                                               var sliceDetails = document.createElement('a');
+                                               sliceDetails.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
+                                               sliceDetails.setAttribute('download', filename);
+                                               sliceDetails.click();
+                                       }
+                                       var sliceInfo;
+                                       for (row in rows){
+                                               if(rows[row]['sliceName']==value){
+                                                       sliceInfo = "Slice Name: "+rows[row]['sliceName']+"\nNumber of Slivers: "+rows[row]['numOfSlivers']+"\nService Level: "+rows[row]['sliceServiceClass']+"\nImage: "+rows[row]['preferredImage']+"\n";    
+                                               for (instanceNodePairs in rows[row]['instanceNodePair']){
+                                                       sliceInfo += instanceNodePairs+"@"+rows[row]['instanceNodePair'][instanceNodePairs]+"\n";
+                                               }
+                                               }
+                                       }
+                                       download('slice.txt', sliceInfo);
+                          });
+               }
+               function editSliverAdv() {
+                       $(".edit-view").click(function () {
+                               var allocatedSlivers = parseInt($(this).parent().siblings(".allocated").html());
+                               var td = $(this).parent().siblings(".allocated");
+                               var pos = oTable.fnGetPosition(td[0]);
+                               $("#numOfSlivers").val("");;
+                               $("#advNumOfSlivers").val("");;
+                               $("#adv-tooltip").css("display", "none");
+                               $("#adv-dialog-form").dialog({
+                                       autoOpen: false,
+                                       height: 200,
+                                       width: 350,
+                                       modal: true,
+                                       dialogClass: "tenantDialog",
+                                       buttons: {
+                                               "Add": function () {
+                                                       allocatedSlivers += parseInt($("#advNumOfSlivers").val());
+                                                               $("#adv-tooltip").css("display", "block");
+                                                               $(this).dialog("close");
+                                                               td.html(allocatedSlivers);
+                                               },
+                                               "Remove": function () {
+                                                       allocatedSlivers -= parseInt($("#advNumOfSlivers").val());
+                                                               $("#adv-tooltip").css("display", "block");
+                                                               $(this).dialog("close");
+                                                               td.html(allocatedSlivers);
+                                               }
+                                       }
+                               });
+                               $("#adv-dialog-form").dialog("open");
+                       });
+               }
+
+               function advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) {
+                       $("#adv-service-level-value").empty();
+                       $("#adv-slice-image-value").empty();
+                       $("#adv-slice-data-set-value").empty();
+                       $("#advTenantSliceDropDown").val(value);
+                       $("<select></select>").attr('id', 'adv-service-level-dropdown').appendTo('#adv-service-level-value');
+                       $("<select></select>").attr('id', 'adv-image-dropdown').appendTo('#adv-slice-image-value');
+                       $("<select></select>").attr('id', 'adv-dataset-dropdown').appendTo('#adv-slice-data-set-value');
+                       $('#advTenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="advTenantSiteTableData"></table>');
+                       var siteNames = [];
+                       var sliverCount;
+                       var tableData = {};
+                       for (row in serviceLevelData) {
+                                $("#adv-service-level-dropdown").append("<option>" + serviceLevelData[row]['serviceClass'] + "</option>");
+                        }
+                        for (row in imageData) {
+                                $("#adv-image-dropdown").append("<option>" + imageData[row]['Image'] + "</option>");
+                        }
+                        for (row in dataSet) {
+                                $("#adv-dataset-dropdown").append("<option>" + dataSet[row]['DataSet'] + "</option>");
+                        }
+
+                       for (row in rows) {
+                               if (rows[row]['sliceName'] == value) {
+                                       var innerRows = rows[row]['sliceSite'];
+                                       $("#adv-service-level-dropdown").val(rows[row]['sliceServiceClass']);
+                                       $("#adv-image-dropdown").val(rows[row]['preferredImage']);
+                                       $("#adv-dataset-dropdown").val(rows[row]['sliceDataSet']);
+                                       for (innerRow in innerRows) {
+                                               tableData[innerRow] = innerRows[innerRow];
+                                       }
+                               }
+                       }
+                       for (row in siteRows) {
+                               var entry = siteRows[row]['siteName'];
+                               if (!(entry in tableData)) {
+                                       tableData[siteRows[row]['siteName']] = 0;
+                               }
+                       }
+                       for (row in tableData) {
+                               siteNames.push([row, tableData[row], '<a href="#" class="edit-view">Edit</a>']);
+                       }
+                       $("#save-btn").unbind().click(function () {
+                               var newTableData = {};
+                               var newSite = $(".siteName");
+                               var newAllocated = $(".allocated");
+                               for (i = 1; i < newSite.length; i++) {
+                                       newTableData[$($(".siteName")[i]).text()] = parseInt($($(".allocated")[i]).text());
+                               }
+                               for (newRow in newTableData) {
+                                       if (newTableData[newRow] > tableData[newRow]) {
+                                               $.ajax({
+                                                       url: '/tenantaddorremsliver/',
+                                                       dataType: 'json',
+                                                       data: {
+                                                               siteName: newRow,
+                                                               count: newTableData[newRow] - tableData[newRow],
+                                                               slice: $("#advTenantSliceDropDown").val(),
+                                                               actionToDo: "add",
+                                                               csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
+                                                               state: "inactive"
+                                                       },
+                                                       type: 'POST',
+                                                       complete: function () {
+                                                               //location.reload();
+                                                               
+                                                        }
+                                               });
+                                       } else if (newTableData[newRow] < tableData[newRow]) {
+                                               $.ajax({
+                                                       url: '/tenantaddorremsliver/',
+                                                       dataType: 'json',
+                                                       data: {
+                                                               siteName: newRow,
+                                                               count: tableData[newRow] - newTableData[newRow],
+                                                               slice: $("#advTenantSliceDropDown").val(),
+                                                               actionToDo: "rem",
+                                                               csrfmiddlewaretoken: "{{ csrf_token }}", // < here
+                                                               state: "inactive"
+                                                       },
+                                                       type: 'POST',
+                                                       complete: function () {
+                                                               //location.reload();
+                                                        }
+                                               });
+                                       }
+                               }
+                                $.ajax({
+                                                        url: '/updateslice/',
+                                                        dataType: 'json',
+                                                        data: {
+                                                                sliceName: $("#advTenantSliceDropDown").val(),
+                                                               serviceClass: $("#adv-service-level-dropdown").val(),
+                                                               imageName: $("#adv-image-dropdown").val(),
+                                                               dataSet: $("#adv-dataset-dropdown").val(),
+                                                               networkPorts:  $("#adv-network-value").val(),
+                                                               privateVolume: $("#private-vol-checkbox").is(":checked"),
+                                                                actionToDo: "update",
+                                                                csrfmiddlewaretoken: "{{ csrf_token }}", // < here
+                                                                state: "inactive"
+                                                        },
+                                                        type: 'POST',
+                                                        success: function () {
+                                                               $("#tabs-5").empty();
+                                                                initTenant();    //location.reload();
+                                                        },
+                                                         error:function (xhr, textStatus, thrownError){
+                                                                  errorDialog("Error:", textStatus + " " + xhr.responseText);
+                                                       }
+                                                       
+                                                });
+
+                       });
+                       oTable = $('#advTenantSiteTableData').dataTable({
+                               "bJQueryUI": true,
+                               "bFilter": false,
+                               "bInfo": false,
+                               "bLengthChange": false,
+                               "bPaginate": false,
+                               "aaData": siteNames,
+                               "bStateSave": true,
+                               "aoColumns": [{
+                                       "sTitle": "Site Name",
+                                       sClass: "siteName"
+                               }, {
+                                       "sTitle": "Allocated",
+                                       sClass: "alignCenter allocated"
+                               }, {
+                                       "sTitle": "Edit",
+                                       sClass: "alignCenter"
+                               }]
+                       });
+                       editSliverAdv();
+                               $('#advTenantSliceDropDown').on('change', function () {
+                                       var selectedValue = $("#advTenantSliceDropDown").val();
+                                       checkForBasicAdvView(selectedValue, rows,imageData,serviceLevelData,siteRows,dataSet);
+                               });
+               }
+
+               function checkForBasicAdvView(value, rows,imageData,serviceLevelData,siteRows,dataSet) {
+                       for (row in rows) {
+                               if (rows[row]['sliceName'] == value) {
+                                       if (rows[row]['numOfSites'] > 1) {
+                                               advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+                                               downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+                                               $("#tenantSliceDataWrapper").css("display","none");
+                                               $("#advancedTenantSliceDataWrapper").css("display","block");
+                                               $("#advTenantSiteTable").css("display","block");
+                                               $("#tenantSiteTable").css("display","none");
+                                               $("#sliver-btn").css("display","none");
+                                               $("#save-btn").css("display","block");
+                                               break;
+                                       } else if(rows[row]['numOfSites'] <= 1){
+                                               showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+                                               downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+                                               $("#tenantSliceDataWrapper").css("display","block");
+                                               $("#advancedTenantSliceDataWrapper").css("display","none");
+                                               $("#advTenantSiteTable").css("display","none");
+                                               $("#tenantSiteTable").css("display","block");
+                                               $("#sliver-btn").css("display","block");
+                                                $("#save-btn").css("display","none");
+                                               break;
+                                       }break;
+                               }
+                       }
+               }
+
+               function UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet) {
+                               //Add check for #dynamicusersliceinfo_filter label-> input having focus here
+                               $("<div></div>").attr('id', 'tenantSliceDataWrapper').appendTo('#tabs-5');
+                               $("<div></div>").attr('id', 'advancedTenantSliceDataWrapper').appendTo('#tabs-5');
+                               var sliceData = '';
+                               sliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="slice-name-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="service-level-value"> </span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="slice-image-value"> </span>  </span><br></div><div class="btn btn-high btn-info" id="advanced-tenant">Go to Advanced View</div>';
+                               var advSliceData = '';
+                               advSliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="adv-tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="adv-slice-name-value"> </span> </span><br><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="adv-service-level-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="adv-slice-image-value"> </span><span class="help-inline">Changes are potentially disruptive to existing slivers</span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Network:</b> <input type="text" name="adv-network-value" id="adv-network-value"> <span class="help-inline">List of port ranges(if any) e.g. 1021-1026,1029</span><br></div><div class="tenant-row"><span class="summary-attr"><b>Data Sets:</b> <span id="adv-slice-data-set-value"> </span>  <input type="checkbox" name="checkbox" id="private-vol-checkbox" value="value"><span class="help-inline">Include Private Volume</span></span></div>';
+                               $('#tenantSliceDataWrapper').append(sliceData).css("display", "none");
+                               $('#advancedTenantSliceDataWrapper').append(advSliceData);
+                               $("#advancedTenantSliceDataWrapper").css("display", "none");
+                               $("<select></select>").attr('id', 'tenantSliceDropDown').appendTo('#slice-name-value');
+                               for (row in rows) {
+                                       $("#tenantSliceDropDown").append("<option>" + rows[row]['sliceName'] + "</option>");
+                               }
+                               $("<select></select>").attr('id', 'advTenantSliceDropDown').appendTo('#adv-slice-name-value');
+                                       for (row in rows) {
+                                               $("#advTenantSliceDropDown").append("<option>" + rows[row]['sliceName'] + "</option>");
+                                       }
+                               $("<div></div>").attr('id', 'tenantSiteTable').appendTo('#tabs-5').css("display","none");
+                               $("<div></div>").attr('id', 'advTenantSiteTable').appendTo('#tabs-5').css("display", "none");
+                               $('<div class="btn btn-success" id="create-slice-btn"><i class="icon-plus-sign icon-white"></i>&nbsp;Create New Slice</div>').appendTo("#tabs-5");
+                               $('<div class="btn btn-success" id="delete-slice-btn"><i class="icon-plus-sign icon-white"></i>&nbsp;Delete a Slice</div>').appendTo("#tabs-5");
+                               $('<div class="btn btn-high btn-info" id="download-details">Download Slice Details</div>').appendTo("#tabs-5");
+                               $('<div class="btn btn-success" id="sliver-btn"><i class="icon-plus-sign icon-white"></i>&nbsp;Add/Remove Slivers</div>').appendTo("#tabs-5");
+                               $('<div class="btn btn-high btn-info" id="save-btn">Save</div>').appendTo("#tabs-5").css("display", "none");
+                               $("#advanced-tenant").unbind().click(function () {
+                                       var value = $("#tenantSliceDropDown").val();
+                                       advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+                                                $("#tenantSliceDataWrapper").css("display","none");
+                                                $("#advancedTenantSliceDataWrapper").css("display","block");
+                                                $("#advTenantSiteTable").css("display","block");
+                                                $("#tenantSiteTable").css("display","none");
+                                                $("#sliver-btn").toggle();
+                                                $("#save-btn").toggle();
+
+                       });
+                       $("#sliver-btn").click(function () {
+                               $("#basic-tooltip").css("display", "none");
+                               $("#dialog-form").dialog({
+                                       autoOpen: false,
+                                       height: 200,
+                                       width: 400,
+                                       modal: true,
+                                       dialogClass: "tenantDialog",
+                                       buttons: {
+                                               "Add": function () {
+                                                       $.ajax({
+                                                               url: '/tenantaddorremsliver/',
+                                                               dataType: 'json',
+                                                               data: {
+                                                                       count: parseInt($("#numOfSlivers").val()),
+                                                                       slice: $("#tenantSliceDropDown").val(),
+                                                                       actionToDo: "add",
+                                                                       csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
+                                                                       state: "inactive"
+                                                               },
+                                                               type: 'POST',
+                                                               beforeSend: function () {
+                                                                       if (!$("#numOfSlivers").val()) {
+                                                                               $("#basic-tooltip").css("display", "block");
+                                                                               return false;
+                                                                       } else {
+                                                                               return true;
+                                                                       }
+                                                               },
+                                                               success: function () {
+                                                                       location.reload();
+$("#dialog-form").dialog("close");
+                                                               }
+                                                       });
+                                               },
+                                               Remove: function () {
+                                                       $.ajax({
+                                                               url: '/tenantaddorremsliver/',
+                                                               dataType: 'json',
+                                                               data: {
+                                                                       count: parseInt($("#numOfSlivers").val()),
+                                                                       slice: $("#tenantSliceDropDown").val(),
+                                                                       actionToDo: "rem",
+                                                                       csrfmiddlewaretoken: "{{ csrf_token }}", // < here
+                                                                       state: "inactive"
+                                                               },
+                                                               type: 'POST',
+                                                               beforeSend: function () {
+                                                                       if (!$("#numOfSlivers").val()) {
+                                                                               $("#basic-tooltip").css("display", "block");
+                                                                               return false;
+                                                                       } else {
+                                                                               return true;
+                                                                       }
+                                                               },
+                                                               success: function () {
+$("#dialog-form").dialog("close");                                                             
+location.reload();
+
+                                                               }
+                                                       });
+                                               }
+                                       }
+                               });
+                               $("#dialog-form").dialog("open");
+                       });
+                       $("#create-slice-btn").unbind().click(function () {
+                               $("#new-service-class").empty();
+                               $("#new-image").empty();
+                               $("#mount-data-sets").empty();
+                               $("#new-network").empty();
+                               for (row in serviceLevelData) {
+                                       $("#new-service-class").append("<option>" + serviceLevelData[row]['serviceClass'] + "</option>");
+                               }
+                               for (row in imageData) {
+                                       $("#new-image").append("<option>" + imageData[row]['Image'] + "</option>");
+                               }
+                               for (row in dataSet) {
+                                        $("#mount-data-sets").append("<option>" + dataSet[row]['DataSet'] + "</option>");
+                                }
+                               var nameOfSlice = $("#new-slice-name").val();
+                               var nameOfServiceClass = $("#new-service-class").val();
+                               var nameOfImage = $("#new-image").val();
+                               $("#create-slice-form").dialog({
+                                       autoOpen: false,
+                                       height: 400,
+                                       width: 400,
+                                       modal: true,
+                                       dialogClass: "tenantDialog",
+                                       buttons: {
+                                               "Submit": function () {
+                                                       $.ajax({
+                                                               url: '/createnewslice/',
+                                                               dataType: 'json',
+                                                               data: {
+                                                                       sliceName: $("#new-slice-name").val(),
+                                                                       serviceClass: nameOfServiceClass,
+                                                                       imageName: $("#new-image").val(),
+                                                                       network: $("#new-network").val(),
+                                                                       privateVolume: $("#private-vol").is(":checked"),
+                                                                       mountDataSets: $("#mount-data-sets").val(),
+                                                                       actionToDo: "add",
+                                                                       csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
+                                                                       state: "inactive"
+                                                               },
+                                                               async: false,
+                                                               type: 'POST',
+                                                               beforeSend: function () {
+                                                                       if (!$("#new-slice-name").val()) {
+                                                                               $("#tooltip").css("display", "block");
+                                                                               return false;
+                                                                       } else {
+                                                                               return true;
+                                                                       }
+                                                               },
+                                                               success: function () {
+                                                                       location.reload();
+                                                               }
+                                                       });
+                                                  $.ajax({
+                                                                url: '/tenantaddorremsliver/',
+                                                                dataType: 'json',
+                                                                data: {
+                                                                        count: parseInt($("#number-of-slivers").val()),
+                                                                        slice: $("#new-slice-name").val(),
+                                                                        actionToDo: "add",
+                                                                        csrfmiddlewaretoken: "{{ csrf_token }}", // < here
+                                                                        state: "inactive"
+                                                                },
+                                                               async: false,
+                                                                type: 'POST',
+                                                                success: function () {
+                                                                        location.reload();
+                                                                }
+                                                        });
+
+                                               },
+                                               Cancel: function () {
+                                                       $(this).dialog("close");
+                                               }
+                                       }
+                               });
+                               $("#create-slice-form").dialog("open");
+                       });
+                       $("#delete-slice-btn").unbind().click(function () {
+                               $("#delete-slice").empty();
+                               for (row in rows) {
+                                       $("#delete-slice").append("<option>" + rows[row]['sliceName'] + "</option>");
+                               }
+                               $("#delete-slice-form").dialog({
+                                       autoOpen: false,
+                                       height: 200,
+                                       width: 350,
+                                       modal: true,
+                                       dialogClass: "tenantDialog",
+                                       buttons: {
+                                               "Delete": function () {
+                                                       $.ajax({
+                                                               url: '/tenantdeleteslice/',
+                                                               dataType: 'json',
+                                                               data: {
+                                                                       sliceName: $("#delete-slice").val(),
+                                                                       csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
+                                                                       state: "inactive"
+                                                               },
+                                                               type: 'POST',
+                                                               success: function () {
+                                                                       location.reload();
+                                                               },
+                                                          error:function (xhr, textStatus, thrownError){
+                                                                   errorDialog("Error:", textStatus + " " + xhr.responseText);
+                                                        }
+                                                       });
+                                               },
+                                               Cancel: function () {
+                                                       $(this).dialog("close");
+                                               }
+                                       }
+                               });
+                               $("#delete-slice-form").dialog("open");
+                       });
+               }
+
+
+       function initTenant() {
+               jQuery.ajax({
+                       url: '/tenantview',
+                       dataType: 'json',
+                       success: function (data) {
+                               var rows = data['userSliceInfo']['rows'];
+                               var imageData = data['image']['rows'];
+                               //var networkData = data['network']['rows'];
+                               var serviceLevelData = data['sliceServiceClass']['rows'];
+                               var siteRows = data['sites']['rows'];
+                               var dataSet = data['mountDataSets']['rows'];
+                               UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet);
+                               if(!(data['publicKey'])){
+                                       $(".public-key-warning").css("display","block");
+                               }
+                               var value = $("#tenantSliceDropDown").val();
+                               checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet);
+                               $("#tooltip").css("display", "none");
+                               $("#basic-tooltip").css("display", "none");
+                               $("#adv-tooltip").css("display", "none");
+                       },
+                       complete: function () {}
+               });
+       }
+               
+       initTenant();
+});
+</script>
+
+</html>
index 707ee96..0f616e5 100644 (file)
@@ -1,25 +1,31 @@
-{% extends "admin/base.html" %}
+{% extends "admin/dashboard/dashboard_base.html" %}
 {% load admin_static %}
 
 {% block content %}
-<h1>Welcome <a href="core/user/{{user.id}}">{{user.email}}</a> from Site: <a href="core/site/{{site.id}}">{{site}}</a></h1>
-<table class="table table-striped table-bordered table-hover table-condensed">
-<thead><tr>
-<th class="sortable">Slices</th><th class="sortable">Privilege</th>
-<th class="sortable">Reservations</th>
-</tr></thead>
-{% for entry in userSliceInfo %}
-<tr><td> <a href="core/slice/{{entry.slice.id}}">{{entry.slice.name}}</a><br>
-</td><td>{{entry.role}}</td>
-{% if entry.reservations %}
-<td><a href="core/slice/{{entry.slice.id}}/#reservations">
-{% for resSlot in entry.reservations.1 %}
-{{resSlot}} <br>
-{% endfor %}
-</a></td></tr>
-{% else %}
-<td></td></tr>
-{% endif %}
-{% endfor %}
-</table>
+<!-- <div id="hometabs" class="inner-center-column ui-tabs ui-widget ui-widget-content ui-corner-all"> -->
+<div id="hometabs" >
+  <ul id="suit_form_tabs" class="nav nav-tabs nav-tabs-suit" data-tab-prefix="suit-tab">
+    <li><a href="#tabs-1">Developer View</a></li>
+    <li><a href="#tabs-2">CDN Operations </a></li>
+    <li><a href="#tabs-3">Historical</a></li>
+    <li><a href="#tabs-4">Slice Interactions</a></li>
+    <li><a href="#tabs-5">Tenant</a></li>
+  </ul>
+<div id="tabs-1">
+{% include "/opt/planetstack/templates/admin/dashboard/developer.html" %}
+</div>
+<div id="tabs-2">
+{% include "/opt/planetstack/templates/admin/dashboard/cdnoperations.html" %}
+</div>
+<div id="tabs-3">
+{% include "/opt/planetstack/templates/admin/dashboard/hpc_historical.html" %}
+</div>
+<div id="tabs-4">
+{% include "/opt/planetstack/templates/admin/dashboard/slice_interactions.html" %}
+</div>
+<div id="tabs-5">
+{% include "/opt/planetstack/templates/admin/dashboard/tenant.html" %}
+</div>
+</div>
+
 {% endblock %}
index 072f73b..b04f842 100644 (file)
   <div class="submit-row">
     <input type="submit" class="btn btn-info" value="{% trans 'SIGN IN' %}" />
   </div>
+{% url 'django-admindocs-docroot' as docsroot %}
+                  {% if docsroot %}
+<div class="createAccountLink"><a href="{{ docsroot }}">{% trans 'Request a new Account' %}</a></div>
 
-<div class="forgotLink"><a href="{{ password_reset_url }}">{% trans 'Forgot password?' %}</a></div><div class="createAccountLink"><a href="#">{% trans 'Create an Account' %}</a></div>
+                  {% endif %}
 </form>
-
 <script type="text/javascript">
 document.getElementById('id_username').focus()
 </script>
diff --git a/planetstack/templates/admin/newminidashboard.html b/planetstack/templates/admin/newminidashboard.html
new file mode 100644 (file)
index 0000000..f1180ab
--- /dev/null
@@ -0,0 +1,71 @@
+{% if not DISABLE_MINIDASHBOARD %}
+
+<div id="newMiniDashboard">
+    <div class="hide" id="selectedMainNav">{{ opts.verbose_name_plural|capfirst }}</div>
+    <div class="hide" id="currentOriginalNode">{{ original|truncatewords:"18" }}</div>
+    <div class="hide" id="minidashStatus"></div>
+    <div class="miniDashPair">
+        <button type="button" name="nodeCount" id="miniDashNodeCount" class="minidashbutton">--</button>
+        <label for="nodeCount" id="miniDashNodeCountLabel">Active Nodes</label>
+    </div>
+    <div class="miniDashPair">
+        <button type="button" name="avgLoad" id="miniDashAvgLoad" class="minidashbutton">--</button>
+        <label for="avgLoad" id="miniDashAvgLoadLabel">Average Load</label>
+    </div>
+    <div class="miniDashPair">
+        <button type="button" name="bandwidth" id="miniDashBandwidth" class="minidashbutton">--</button>
+        <label for="bandwidth" id="miniDashBandwidthLabel">Bandwidth</label>
+    </div>
+    <div class="endDashPair">
+    </div>
+</div>
+
+<div id="nodeCountDialog" class="miniDashModal" > 
+<div id="nodeCountGraph" ></div>
+</div>
+
+<div id="bandwidthDialog" class="miniDashModal" > 
+<div id="bandwidthGraph" ></div>
+</div>
+
+<div id="avgLoadDialog" class="miniDashModal" > 
+<div id="avgLoadGraph" ></div>
+</div>
+
+<script>
+/** If the analytics have already been set -- read them in on page load **/
+if (typeof window != "undefined") {
+    if (typeof window.pageAnalyticsData != "undefined") {
+        updatePageAnalyticsData(window.pageAnalyticsData);
+    }
+}
+
+var loadingDiv = '<div class="loading">Loading ...</div>';
+
+$( "#nodeCountDialog" ).dialog({ title: "OpenCloud Node Count", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
+$( "#miniDashNodeCount" ).click(function() {
+    $( "#nodeCountGraph" ).html(loadingDiv);
+    $( "#nodeCountDialog" ).dialog("open");
+    var options = {"title": "Node Count", "vAxis": {"title": "Number of Nodes", "minValue": 0, "maxValue": 250}};
+    renderChart(true,"#nodeCountDialog", "#nodeCountGraph", window.pageAnalyticsUrl, 0, 2, google.visualization.data.sum, options);
+    });
+
+$( "#bandwidthDialog" ).dialog({ title: "OpenCloud Bandwidth", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
+$( "#miniDashBandwidth" ).click(function() {
+    $("#bandwidthGraph").html(loadingDiv);
+    $( "#bandwidthDialog" ).dialog("open");
+    var options = {"title": "Total Bandwidth", "vAxis": {"title": "Total Bandwidth (Gbps)"}};
+    renderChart(true,"#bandwidthDialog", "#bandwidthGraph", window.pageBandwidthUrl, 0, 1, agg_bandwidth, options);
+    });
+
+$( "#avgLoadDialog" ).dialog({ title: "OpenCloud Average Load", modal: true, position: ['middle', 40], resizable: true, autoOpen: false, width: 527, height: 400});
+$( "#miniDashAvgLoad" ).click(function() {
+    $("#avgLoadGraph").html(loadingDiv);
+    $( "#avgLoadDialog" ).dialog("open");
+    var options = {"title": "Average CPU Utilization", "vAxis": {"title": "CPU Utilization (%)"}};
+    renderChart(true,"#avgLoadDialog", "#avgLoadGraph", window.pageAnalyticsUrl, 0, 1, google.visualization.data.sum, options);
+    });
+
+</script>
+
+{% endif %}
diff --git a/planetstack/templates/admin/request_account.html b/planetstack/templates/admin/request_account.html
new file mode 100644 (file)
index 0000000..e69de29
index b3193f4..55d2467 100644 (file)
@@ -10,6 +10,8 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 from openstack.manager import OpenStackManager
 from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
 
+slice_name_map = {}
+
 def ps_id_to_pl_id(x):
     # Since we don't want the PlanetStack object IDs to conflict with existing
     # PlanetLab object IDs in the CMI, just add 100000 to the PlanetStack object
@@ -20,12 +22,15 @@ def pl_id_to_ps_id(x):
     return x - 100000
 
 def pl_slice_id(slice):
-    if slice.name == "princeton_vcoblitz":
+    if slice.name.startswith("princeton_vcoblitz"):
         # 70 is the slice id of princeton_vcoblitz on vicci
         return 70
     else:
         return ps_id_to_pl_id(slice.id)
 
+def ps_slicename_to_pl_slicename(x):
+    return slice_name_map.get(x,x)
+
 def filter_fields(src, fields):
     dest = {}
     for (key,value) in src.items():
@@ -51,7 +56,7 @@ def GetSlices(filter={}):
                  "slice_tag_ids": [],
                  "peer_id": None,
                  "site_id": ps_id_to_pl_id(ps_slice.site_id),
-                 "name": ps_slice.name}
+                 "name": ps_slicename_to_pl_slicename(ps_slice.name)}
 
                  # creator_person_id, person_ids, expires, created
 
@@ -159,6 +164,22 @@ def GetInterfaces(slicename, node_ids):
                 interfaces.append(interface)
     return interfaces
 
+def find_multi_slicename(orig_slicename):
+    """
+         Because we sometimes have issues deleting a slice in planetstack and
+         creating a new one, allow us to use a prefix match, that way someone
+         can put a version number of the end of the slicename
+    """
+    global slice_name_map
+    slices = Slice.objects.filter()
+    for slice in slices:
+        if slice.name.startswith(orig_slicename):
+            slice_name_map[slice.name] = orig_slicename
+            return slice.name
+
+    return orig_slicename
+
+
 def GetConfiguration(name):
     slicename = name["name"]
     if "node_id" in name:
@@ -166,6 +187,8 @@ def GetConfiguration(name):
     else:
         node_id = 0
 
+    slicename = find_multi_slicename(slicename)
+
     node_sliver_tags = GetTags(slicename, node_id)
 
     slices = GetSlices({"name": slicename})
@@ -215,11 +238,13 @@ def GetConfiguration(name):
             'nodes': nodes}
 
 if __name__ == '__main__':
+    find_multi_slicename("princeton_vcoblitz")  # set up the mapping for princeton_vcoblitz2 -> princeton_vcoblitz
+
     slices = GetSlices()
     nodes = GetNodes()
 
     if ("-d" in sys.argv):
-        config = GetConfiguration({"name": "princeton_coblitz"})
+        config = GetConfiguration({"name": "princeton_vcoblitz"})
         print config
         print slices
         print nodes
index 4fc1374..7fdfbdd 100644 (file)
@@ -1,8 +1,5 @@
 """
-    Basic Sliver Test
-
-    1) Create a slice1
-    2) Create sliver1 on slice1
+    Generates billing sample data
 """
 
 import datetime
@@ -14,6 +11,10 @@ import random
 import sys
 import time
 
+# The granularity at which the charge collection system collects charges. Once
+# per hour makes for a very slow UI, so I upped it to once per 8 hours.
+CHARGE_HOURS = 8
+
 MINUTE_SECONDS = 60
 HOUR_SECONDS = MINUTE_SECONDS * 60
 DAY_SECONDS = HOUR_SECONDS * 24
@@ -86,34 +87,42 @@ def generate_payments(account):
              payment = Payment(account=account, amount=invoice.amount, date=payment_time)
              payment.save()
 
+print "deleting old stuff"
+
 delete_all(Invoice)
 delete_all(Charge)
 delete_all(Payment)
 delete_all(Account)
 delete_all(UsableObject)
 
+print "creating accounts"
+
 for site in Site.objects.all():
     # only create accounts for sites where some slices exist
     if len(site.slices.all()) > 0:
         account = Account(site=site)
         account.save()
 
+print "generating charges"
+
 for slice in Slice.objects.all():
     site = slice.site
     account = site.accounts.all()[0]
     serviceClass =slice.serviceClass
 
-    if not (slice.name in ["DnsRedir", "DnsDemux", "HyperCache"]):
+    if not (slice.name in ["DnsRedir", "DnsDemux", "HyperCache", "Hadoop", "Owl", "Stork", "Syndicate", "test-slice-1", "test-slice-2", "test", "test2"]):
         continue
 
+    print "   generating charges for", slice.name
+
     now = int(time.time())/HOUR_SECONDS*HOUR_SECONDS
 
     charge_kind=None
     for resource in slice.serviceClass.resources.all():
-        if resource.name == "cpu.cores":
+        if resource.name == "numberCores":
             charge_kind = "reservation"
             cost = resource.cost
-        elif (resource.name == "cycles") or (resource.name == "Cycles"):
+        elif (charge_kind==None) and (resource.name == "cycles") or (resource.name == "Cycles"):
             charge_kind = "besteffort"
             cost = resource.cost
 
@@ -121,15 +130,17 @@ for slice in Slice.objects.all():
         print "failed to find resource for", slice.serviceClass
         continue
 
-    for sliver in slice.slivers.all():
+    for sliver in slice.slivers.all()[:4]:    # only do up to 4 slivers; it's way too much data otherwise
         hostname = sliver.node.name
-        for i in range(now-MONTH_SECONDS, now, HOUR_SECONDS):
+        for i in range(now-MONTH_SECONDS, now, CHARGE_HOURS*HOUR_SECONDS):
             if charge_kind == "besteffort":
-                core_hours = random.randint(1,60)/100.0
+                core_hours = random.randint(20,60)/100.0
             else:
                 core_hours = 1
 
-            amount = core_hours * cost
+            core_hours = core_hours * CHARGE_HOURS
+
+            amount = float(core_hours * cost) / 100.0
 
             object = get_usable_object(hostname)
 
@@ -138,6 +149,8 @@ for slice in Slice.objects.all():
             charge = Charge(account=account, slice=slice, kind=charge_kind, state="pending", date=date, object=object, coreHours=core_hours, amount=amount)
             charge.save()
 
+print "doing invoices and payments"
+
 for account in Account.objects.all():
     generate_invoices(account)
     generate_payments(account)
diff --git a/planetstack/uwsgi/planetstack.ini b/planetstack/uwsgi/planetstack.ini
new file mode 100644 (file)
index 0000000..c712568
--- /dev/null
@@ -0,0 +1,14 @@
+[uwsgi]
+chdir = /opt/planetstack
+module = planetstack.wsgi:application
+env = DJANGO_SETTINGS_MODULE=planetstack.settings
+socket = /var/run/planestack.uwsgi.sock
+socket = 127.0.0.1:9001
+http = 128.112.139.48:9002
+stats = 127.0.0.1:9003
+workers = 3
+master = true
+processes = 8 
+#--uid=1000 --gid=2000
+harakiri = 20
+daemonize=/var/log/uwsgi/planetstack.log