changeset 886:45f7e5319dcd storage-ng

merged ronny's repo
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Mon, 26 Sep 2011 02:38:29 +0200
parents 70bd8a85eee5 (diff) ba8c41979a44 (current diff)
children f51d1619c549
files MoinMoin/storage/middleware/indexing.py
diffstat 19 files changed, 329 insertions(+), 1213 deletions(-) [+]
line wrap: on
line diff
--- a/MoinMoin/_tests/maketestwiki.py	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-# Copyright: 2005 by Thomas Waldmann
-# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.
-
-"""
-MoinMoin - make a test wiki
-
-Usage:
-
-    maketestwiki.py
-"""
-
-
-import os, sys, shutil, errno
-import tarfile
-
-filename = globals().get("__file__") or sys.argv[0]
-moinpath = os.path.abspath(os.path.join(os.path.dirname(filename), os.pardir, os.pardir))
-
-WIKI = os.path.abspath(os.path.join(moinpath, 'tests', 'wiki'))
-SHARE = os.path.abspath(os.path.join(moinpath, 'wiki'))
-
-
-def removeTestWiki():
-    print 'removing old wiki ...'
-    dir = 'data'
-    try:
-        shutil.rmtree(os.path.join(WIKI, dir))
-    except OSError as err:
-        if not (err.errno == errno.ENOENT or
-                (err.errno == 3 and os.name == 'nt')):
-            raise
-
-
-def copyData():
-    print 'copying data ...'
-    src = os.path.join(SHARE, 'data')
-    dst = os.path.join(WIKI, 'data')
-    shutil.copytree(src, dst)
-
-
-def run(skip_if_existing=False):
-    try:
-        os.makedirs(WIKI)
-    except OSError as e:
-        if e.errno != errno.EEXIST:
-            raise
-
-    if skip_if_existing and os.path.exists(os.path.join(WIKI, 'data')):
-        return
-    removeTestWiki()
-    copyData()
-
-if __name__ == '__main__':
-    sys.path.insert(0, moinpath)
-    run()
-
--- a/MoinMoin/_tests/testitems.xml	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-<backend><item name="HelpOnLinking"><meta></meta>
-<revision revno="0"><meta><entry key="hostname"><str>0.0.0.0</str>
-</entry>
-<entry key="#"><tuple><str>Please edit system and help pages ONLY in the master wiki!</str>
-<str>For more information, please see MoinMoin:MoinDev/Translation.</str>
-<str>master-page:Unknown-Page</str>
-<str>master-date:Unknown-Date</str>
-</tuple>
-</entry>
-<entry key="sha1"><str>c9b17c6d4d6ea0b59a040dde48c8cb0286ba9822</str>
-</entry>
-<entry key="userid"><str></str>
-</entry>
-<entry key="name"><str>HelpOnLinking</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="comment"><str></str>
-</entry>
-<entry key="address"><str>0.0.0.0</str>
-</entry>
-<entry key="acl"><str>-All:write Default</str>
-</entry>
-<entry key="syspage_version"><int>1</int>
-</entry>
-<entry key="mimetype"><str>text/x.moin.wiki</str>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="extra"><str></str>
-</entry>
-<entry key="is_syspage"><bool>True</bool>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBMaW5raW5nIFJlZmVyZW5jZSA9DQo8PFRhYmxlT2ZDb250ZW50cz4+DQpUaGVyZSBhcmUgdHdvIGZ1bmRhbWVudGFsIGxpbmtpbmcgdHlwZXMgb24gIU1vaW5Nb2luLg0KDQogKiBCcmFja2V0cyAoYFtbICBdXWApIGFyZSB1c2VkIHRvICcnbGluaycnIHRvIGEgdGFyZ2V0IChhIGxvY2FsIHdpa2kgcGFnZSwgYW4gZXh0ZXJuYWwgVVJMLCBhIGZpbGUsIGV0YykuDQogKiBCcmFjZXMgKGB7eyAgfX1gKSBhcmUgdXNlZCB0byAnJ2VtYmVkJycgKHRyYW5zY2x1ZGUvaW5jbHVkZS9zaG93KSBzb21lIHRhcmdldCAob2Z0ZW4gYW4gaW1hZ2UsIGJ1dCBjYW4gYmUgdGV4dCkuDQoNClRhcmdldHMgYXJlIHZlcnkgZmxleGlibGUgaW4gdGhhdCB0aGV5IHN1cHBvcnQgdmlydHVhbGx5IGFueSBzdHlsZSB5b3UgY2FuIHdpdGggcmVndWxhciBIVE1MIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocywgYW5jaG9ycywgZXRjKS4NCg0KPT0gTGlua2luZyA9PQ0KUHJvcGVybHktZm9ybWVkIFVSTHMgKGkuZS4ge3t7aHR0cDovL2V4YW1wbGUubmV0fX19KSwgSW50ZXJXaWtpIHBhZ2VzLCBlbWFpbCBhZGRyZXNzZXMsIGFuZCBDYW1lbENhc2UgcGFnZW5hbWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZWQgYXMgdGFyZ2V0cyBldmVuIHdpdGhvdXQgdXNpbmcgYnJhY2tldHMuDQp8fDx0YWJsZXdpZHRoPSIxMDAlInJvd2JnY29sb3I9IiNmZmZmY2MiMjUlPicnJ0Rlc2NyaXB0aW9uJycnIHx8JycnU3ludGF4JycnIHx8JycnQ29tbWVudCcnJyB8fA0KfHxpbnRlcm5hbCBsaW5rIHx8YFdpa2lOYW1lYCB8fENhbWVsQ2FzZSBwYWdlIG5hbWUgfHwNCnx8aW50ZXJuYWwgZnJlZSBsaW5rIHx8YFtbZnJlZSBsaW5rXV1gIHx8YW55IHBhZ2UgbmFtZSB8fA0KfHxpbnRlcm5hbCBsaW5rIHRvIHN1YiBwYWdlIHx8YC9TdWJQYWdlYCBvciBgW1svc3ViIHBhZ2VdXWAgfHwgfHwNCnx8aW50ZXJuYWwgbGluayB0byBzaXN0ZXIgcGFnZSB8fGAuLi9TaXN0ZXJQYWdlYCBvciBgW1suLi9TaXN0ZXJQYWdlfGxpbmsgdGV4dF1dYCB8fCB8fA0KfHxpbnRlcm5hbCBsaW5rIHdpdGggbGlua3RleHQgfHxgW1tTb21lUGFnZXxzb21lIFBhZ2VdXWAgfHwgfHwNCnx8aW50ZXJuYWwgbGluayB0byBhIHNlY3Rpb24gfHxgW1tTb21lUGFnZSNzdWJzZWN0aW9ufHN1YnNlY3Rpb24gb2YgU29tZSBQYWdlXV1gIHx8IFNlZSBbWyNBbmNob3JzXV0gc2VjdGlvbiBiZWxvdyB8fA0KfHxpbnRlcm5hbCBsaW5rIHdpdGggbGlua3RleHQgJiBwYXJhbWV0ZXIgfHxgW1tTb21lUGFnZXxzb21lIFBhZ2V8dGFyZ2V0PSJfYmxhbmsiXV1gIHx8c2VlIGJlbG93IGZvciBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnMgfHwNCnx8aW50ZXJuYWwgbGluayB1c2luZyBhIGdyYXBoaWMgYXMgYnV0dG9uIHx8YFtbU29tZVBhZ2V8e3thdHRhY2htZW50OmltYWdlZmlsZS5wbmd9fV1dYCB8fCB8fA0KfHxpbnRlcm5hbCBsaW5rIHVzaW5nIGdyYXBoaWMgYnV0dG9uLCBvcGVuIG5ldyB3aW5kb3cgfHxgW1tTb21lUGFnZXx7e2F0dGFjaG1lbnQ6c2FtcGxlZ3JhcGhpYy5wbmd9fXx0YXJnZXQ9Il9ibGFuayJdXWAgfHwgfHwNCnx8bGluayB0byBhdHRhY2htZW50IHx8YFtbYXR0YWNobWVudDppbWFnZS5wbmddXWAgfHxsaW5rcyB0byBhdHRhY2htZW50IGltYWdlIHx8DQp8fGxpbmsgdG8gYXR0YWNobWVudCBvZiBhbm90aGVyIHBhZ2UgfHxgW1thdHRhY2htZW50OlNvbWVQYWdlL2ltYWdlLnBuZ11dYCB8fGxpbmtzIHRvIGltYWdlIGF0dGFjaGVkIHRvIGEgZGlmZmVyZW50IHBhZ2UgfHwNCnx8aW50ZXJ3aWtpIGxpbmsgfHxgT3RoZXJ3aWtpOnNvbWVwYWdlYCB8fHJlcXVpcmVzIHVwcGVyY2FzZSB3aWtpbmFtZSB8fA0KfHxpbnRlcndpa2kgZnJlZSBsaW5rIHx8YFtbb3RoZXJ3aWtpOnNvbWVwYWdlXV1gIHx8YW55IHdpa2luYW1lIGluIHRoZSBtYXAgd29ya3MgfHwNCnx8ZXh0ZXJuYWwgbGluayB8fGBodHRwOi8vZXhhbXBsZS5uZXQvYCB8fCB8fA0KfHxleHRlcm5hbCBsaW5rIHdpdGggbGlua3RleHQgfHxgW1todHRwOi8vZXhhbXBsZS5uZXQvfGV4YW1wbGUgc2l0ZV1dYCB8fCB8fA0KfHxleHRlcm5hbCBsaW5rIHdpdGggbGlua3RleHQsIG9wZW4gbmV3IHdpbmRvdyB8fGBbW2h0dHA6Ly9leGFtcGxlLm5ldC98ZXhhbXBsZSBzaXRlfHRhcmdldD0iX2JsYW5rIl1dYCB8fHNlZSBiZWxvdyBmb3IgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zIHx8DQp8fGV4dGVybmFsIGxpbmsgdXNpbmcgYSBncmFwaGljIGFzIGJ1dHRvbiB8fGBbW2h0dHA6Ly9leGFtcGxlLm5ldC98e3thdHRhY2htZW50OnNhbXBsZWdyYXBoaWMucG5nfX1dXWAgfHwgfHwNCnx8ZXh0ZXJuYWwgbGluayB1c2luZyBncmFwaGljIGJ1dHRvbiwgb3BlbiBuZXcgd2luZG93IHx8YFtbaHR0cDovL2V4YW1wbGUubmV0L3x7e2F0dGFjaG1lbnQ6c2FtcGxlZ3JhcGhpYy5wbmd9fXx0YXJnZXQ9Il9ibGFuayJdXWAgfHwgfHwNCnx8Ym9yZGVyIG9mIGludGVybmFsIGxpbmsgfHx7e3tXaWtpTmFtZWBgc319fSB8fDIgYmFja3RpY2tzIC0gZm9yIHdoZW4gYSAhV2lraU5hbWUgZW5kcyBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCB8fA0KfHxhdm9pZCBhbiBpbnRlcm5hbCBsaW5rIHx8YCFXaWtpTmFtZWAgfHxjb25maWd1cmFibGUgZnVuY3Rpb24gfHwNCg0KPDxCUj4+DQoNCj09IEVtYmVkZGluZyA9PQ0KRW1iZWRkaW5nL1RyYW5zY2x1c2lvbiBpcyB1c2VkIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYW4gZXh0ZXJuYWwgZmlsZSB3aXRoaW4geW91ciB3aWtpLiAgTW9zdCBjb21tb25seSwgdGhpcyB3aWxsIGJlIGEgZ3JhcGhpYy4gQnV0IGl0IGNhbiBhbHNvIGJlIGEgdGV4dCBmaWxlIG9yIGFueSBvdGhlciBmaWxlIHRoYXQgdGhlIHdpa2kgdW5kZXJzdGFuZHMgKGZvciBleGFtcGxlLCB5b3UgY2FuIHByb3ZpZGUgbGluayBmb3IgZG93bmxvYWRpbmcgJydhbmQnJyBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGF0IGZpbGUgb24gdGhlIHBhZ2UhKS4NCg0KJydzZWUgSGVscE9uSW1hZ2VzIGZvciBleGFtcGxlcy4nJw0KDQp8fDx0YWJsZXdpZHRoPSIxMDAlInJvd2JnY29sb3I9IiNmZmZmY2MiMjUlPicnJ0Rlc2NyaXB0aW9uJycnIHx8JycnU3ludGF4JycnIHx8JycnQ29tbWVudCcnJyB8fA0KfHxlbWJlZCBhbiBhdHRhY2hlZCBncmFwaGljcyB8fGB7e2F0dGFjaG1lbnQ6aW1hZ2UucG5nfX1gIHx8c2hvdyBhdHRhY2hlZCBpbWFnZSBmaWxlIGBpbWFnZS5wbmdgIHx8DQp8fGVtYmVkIGFuIGF0dGFjaGVkIGdyYXBoaWNzIGFuZCBnaXZlIGFsdCB0ZXh0IHx8YHt7YXR0YWNobWVudDppbWFnZS5wbmd8YWx0IHRleHR9fWAgfHxzaG93IGF0dGFjaGVkIGltYWdlIGZpbGUgYGltYWdlLnBuZ2Agd2l0aCBhbHRlcm5hdGl2ZSB0ZXh0IHNheWluZyBgYWx0IHRleHRgIChyZWNvbW1lbmRlZCBmb3IgYWNjZXNzaWJpbGl0eSkgfHwNCnx8ZW1iZWQgYW4gYXR0YWNoZWQgZ3JhcGhpY3MgYW5kIGRlZmluZSBhbGlnbm1lbnQgfHxge3thdHRhY2htZW50OmltYWdlLnBuZ3xhbHQgdGV4dHxhbGlnbj0icG9zaXRpb24ifX1gIHx8c2hvdyBhdHRhY2hlZCBpbWFnZSBmaWxlIGBpbWFnZS5wbmdgIHdpdGggYWx0ZXJuYXRpdmUgdGV4dCBgYWx0IHRleHRgIGFuZCAgYWxpZ25lZCB0byAnJ3Bvc2l0aW9uJycsIHdoZXJlICcncG9zaXRpb24nJyBjYW4gYmUgb25lIG9mICcnJ3RvcCcnJywgJycnbWlkZGxlJycnLCAnJydib3R0b20nJycsICcnJ3JpZ2h0JycnIG9yICcnJ2xlZnQnJycgKGRvIG5vdCBvbWl0IGFsdCB0ZXh0KSB8fA0KfHxlbWJlZCBhbiBhdHRhY2hlZCBncmFwaGljcyBhbmQgcmVzaXplIGl0IHx8YHt7YXR0YWNobWVudDppbWFnZS5wbmd8YWx0IHRleHR8d2lkdGg9MTAwIGhlaWdodD0xNTB9fWAgfHxzaG93IGF0dGFjaGVkIGltYWdlIGZpbGUgYGltYWdlLnBuZ2Agd2l0aCBhbHRlcm5hdGl2ZSB0ZXh0IGBhbHQgdGV4dGAgYW5kIHJlc2l6ZSBpdCB0byAxMDBweCB3aWR0aCBhbmQgMTUwcHggaGlnaCAoZG8gbm90IG9taXQgYWx0IHRleHQpIHx8DQp8fGVtYmVkIGFuIGV4dGVybmFsIGdyYXBoaWNzIHx8YHt7aHR0cDovL2V4YW1wbGUubmV0L2ltYWdlLnBuZ319YCB8fHNob3cgdGFyZ2V0IGltYWdlIGlubGluZSB8fA0KfHxlbQ==</chunk>
-<chunk>YmVkIGFuIGV4dGVybmFsIGdyYXBoaWNzIGFuZCBnaXZlIGFsdCB0ZXh0IHx8YHt7aHR0cDovL2V4YW1wbGUubmV0L2ltYWdlLnBuZ3xhbHQgdGV4dH19YCB8fHNob3cgdGFyZ2V0IGltYWdlIGlubGluZSB3aXRoIGFsdGVybmF0aXZlIHRleHQgc2F5aW5nIGBhbHQgdGV4dGAgKHJlY29tbWVuZGVkIGZvciBhY2Nlc3NpYmlsaXR5KSB8fA0KfHxlbWJlZCBhbiBleHRlcm5hbCBncmFwaGljcyBhbmQgZGVmaW5lIGFsaWdubWVudCB8fGB7e2h0dHA6Ly9leGFtcGxlLm5ldC9pbWFnZS5wbmd8YWx0IHRleHR8YWxpZ249InBvc2l0aW9uIn19YCB8fHNob3cgdGFyZ2V0IGltYWdlIGlubGluZSB3aXRoIGFsdGVybmF0aXZlIHRleHQgYGFsdCB0ZXh0YCBhbmQgYWxpZ25lZCB0byAnJ3Bvc2l0aW9uJycsIHdoZXJlICcncG9zaXRpb24nJyBjYW4gYmUgb25lIG9mICcnJ3RvcCcnJywgJycnbWlkZGxlJycnLCAnJydib3R0b20nJycsICcnJ3JpZ2h0JycnLCBvciAnJydsZWZ0JycnIChkbyBub3Qgb21pdCBhbHQgdGV4dCkgfHwNCnx8ZW1iZWQgYW4gZXh0ZXJuYWwgZ3JhcGhpY3MgYW5kIHJlc2l6ZSBpdCB8fGB7e2h0dHA6Ly9leGFtcGxlLm5ldC9pbWFnZS5wbmd8YWx0IHRleHR8d2lkdGg9MTAwfX1gIHx8c2hvdyB0YXJnZXQgaW1hZ2UgaW5saW5lIHdpdGggYWx0ZXJuYXRpdmUgdGV4dCBgYWx0IHRleHRgIGFuZCByZXNpemUgaXQgdG8gMTAwcHggd2lkdGggKGRvIG5vdCBvbWl0IGFsdCB0ZXh0KSB8fA0KDQoNCj09IEV4cGxhbmF0aW9ucyA9PQ0KPT09IFVSTHMgPT09DQpJZiB5b3UgZW50ZXIgVVJMcyBpbnRvIG5vcm1hbCB0ZXh0LCB0aGVyZSBpcyB0aGUgcHJvYmxlbSBvZiBkZXRlY3Rpbmcgd2hhdCBiZWxvbmdzIHRvIHRoZSBVUkwgYW5kIHdoYXQgbm90LiBUaGVyZSBhcmUgZm91ciB3YXlzIHRvIGZvcmNlIHRoZSBlbmRpbmcgb2YgYW4gVVJMOg0KDQogKiBwdXQgYSBzcGFjZSBhZnRlciB0aGUgVVJMLA0KICogdXNlIHRoZSBXaWtpOlNpeFNpbmdsZVF1b3RlcyBlc2NhcGluZywNCiAqIHVzZSB0aGUgZG91YmxlIGJyYWNrZXRlZCBVUkwgc3ludGF4Lg0KDQpUaGUgc3VwcG9ydGVkIFVSTCBzY2hlbWVzIGFyZTogYGh0dHBgLCBgaHR0cHNgLCBgZnRwYCwgYGZpbGVgIGFuZCBzb21lIG90aGVycy4gVGhlIGFkbWluaXN0cmF0b3Igb2YgeW91ciB3aWtpIGNhbiBleHRlbmQgdGhlIHN1cHBvcnRlZCBzY2hlbWVzIGJ5IHVzaW5nIHRoZSB7e3t1cmxfc2NoZW1hc319fSB2YXJpYWJsZSAoc2VlIEhlbHBPbkNvbmZpZ3VyYXRpb24pLg0KDQpJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgc2NoZW1lcywgdGhlcmUgYXJlIE1vaW5Nb2luLXNwZWNpZmljIG9uZXM6IGBhdHRhY2htZW50YCBhbmQgYGRyYXdpbmdgLCB0aGVzZSBhcmUgcmVsYXRlZCB0byBmaWxlIGF0dGFjaG1lbnRzIGFuZCBhcmUgZXhwbGFpbmVkIG9uIEhlbHBPbkFjdGlvbnMvQXR0YWNoRmlsZS4NCg0KPT09IFNwYWNlcyA9PT0NCllvdSBjYW4gdXNlIGRvdWJsZS1icmFja2V0cyAob3IgZG91YmxlLWJyYWNlcykgc3ludGF4IHRvIGxpbmsgdG8gYSBwYWdlIG9yIGZpbGUgbmFtZSB3aXRoIHNwYWNlcy4gVGhpcyB3aWxsIGV2ZW4gd29yayBmb3IgaW50ZXJ3aWtpIGxpbmtzLCBwcm92aWRlZCB0aGUgdGFyZ2V0IHdpa2kgdW5kZXJzdGFuZHMgc3RhbmRhcmQgdXJsIHF1b3RpbmcgKHNwYWNlcyB3aWxsIGJlY29tZSB7e3slMjB9fX0pLg0KDQpIb3dldmVyLCBiZXN0IHByYWN0aWNlIGlzIHRvIHRyeSB0byBhdm9pZCBzcGFjZXMgaW4gVVJMcywgYXMgeW91IG1heSBmaW5kIGl0J3MgbW9yZSBkaWZmaWN1bHQgdG8gd29yayB3aXRoIHRoYXQgVVJMLiBGb3IgZXhhbXBsZSwgaWYgeW91IHRyeSBjb3B5aW5nIGFuZCBlbWFpbGluZyB0aGF0IFVSTCBsaW5rLCB0aGUgcmVjZWl2ZXIgbWF5IGhhdmUgZGlmZmljdWx0eSBsYW5kaW5nIG9uIHRoZSBwYWdlIHlvdSBzcGVjaWZpZWQuDQoNCjw8QW5jaG9yKEFuY2hvcnMpPj4NCj09PSBBbmNob3JzID09PQ0KVG8gJydpbnNlcnQnJyBhbmNob3JzIGludG8gYSBwYWdlIHlvdSBuZWVkIHRoZSAnJ0FuY2hvcicnIG1hY3JvIChzZWUgSGVscE9uTWFjcm9zKTogYDw8QW5jaG9yKGFuY2hvcm5hbWUpPj5gLCB3aGVyZSAiYW5jaG9ybmFtZSIgaXMgdGhlIGFjdHVhbCBpZGVudGlmaWVyIG9mIHRoZSBhbmNob3IuDQoNClRvIGxpbmsgdG8gYW4gYW5jaG9yIG9uIHRoZSBzYW1lIHdpa2kgcGFnZSB1c2UgYFtbI2FuY2hvcm5hbWVdXWAgb3IgYFtbI2FuY2hvcm5hbWV8bGFiZWwgdGV4dF1dYC4NCg0KVG8gbGluayB0byBhbiBhbmNob3Igb24gYW5vdGhlciB3aWtpIHBhZ2Ugd3JpdGUgYFtbUGFnZU5hbWUjYW5jaG9ybmFtZV1dYCBvciBgW1tQYWdlTmFtZSNhbmNob3JuYW1lfGxhYmVsIHRleHRdXWAsIHdoZXJlICJQYWdlTmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIG90aGVyIHBhZ2UgYW5kICJhbmNob3JuYW1lIiBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgYW5jaG9yIG9uIHRoYXQgcGFnZS4NCg0KDQoNCj09PSBQcmV2ZW50aW5nIEF1dG9tYXRpY2FsbHkgR2VuZXJhdGVkIExpbmtzID09PQ0KDQpUbyBrZWVwIGEgd29yZCBsaWtlIFBhZ2VOYW1lIGZyb20gYXV0b21hdGljYWxseSBiZWluZyB0dXJuZWQgaW50byBhIGxpbmssIA0KeW91IGNhbiBzdXBwcmVzcyBDYW1lbENhc2UgbGlua2luZyBieSBwdXR0aW5nIGFuIGV4Y2xhbWF0aW9uIG1hcmsgKHt7eyF9fX0pIGJlZm9yZSB0aGUgd29yZCwgaS5lLiBgIVBhZ2VOYW1lYC4gVGhpcyBtZXRob2Qgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggbW9zdCBzZWFyY2hlcyAodGhlIGV4Y2VwdGlvbiBpcyBjZXJ0YWluIHF1b3RlZCBwaHJhc2VzIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zKS4gDQoNCkFsdGVybmF0aXZlbHksIHlvdSBjYW4gaW5zZXJ0IHR3byBiYWNrLXRpY2tzIHt7e1BhZ2VgYE5hbWV9fX0uICBIb3dldmVyLCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIHRoaXMgaXMgdGhhdCBpdCB3aWxsIHByZXZlbnQgYSBzaW1wbGUgc2VhcmNoIGZvciB0aGUgd29yZCAiIVBhZ2VOYW1lIiBmcm9tIG1hdGNoaW5nIHt7e1BhZ2VgYE5hbWV9fX0gaW4gYSBwYWdlLCBkdWUgdG8gdGhlIGluc2VydGVkIGNoYXJhY3RlcnMuDQoNClRvIHByZXZlbnQgYXV0b21hdGljIFVSTCBsaW5raW5nLCB1c2UgZWl0aGVyIHt7e2BodHRwOi8vLi4uYH19fSBvciBge3t7aHR0cDovLy4uLn19fWAuDQoNCg0KDQo9PT0gVXNpbmcgbGluayBwYXJhbWV0ZXJzID09PQ0KU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBnaXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgYSBsaW5rLCBpbmZsdWVuY2luZyBob3cgaXQgbG9va3MgbGlrZSwgaG93IGl0IGJlaGF2ZXMgYW5kIGhvdyBleGFjdGx5IGl0IGxpbmtzIHRvIHRoZSB0YXJnZXQgLSB0aGlzIGlzIHdoYXQgdGhlICcnJ3BhcmFtcycnJyBwYXJ0IG9mIGBbW3RhcmdldHx0ZXh0fHBhcmFtc11dYCBpcyBmb3IuDQoNCmUuZy4gaWYgeW91IHdhbnQgYSBkaXJlY3QgZG93bmxvYWQgbGluayB5b3Ugd2FudCB0byBlbnRlciBhcyBgcGFyYW0gJmRvPWdldGAgYFtbYXR0YWNobWVudDpIZWxwT25JbWFnZXMvcGluZWFwcGxlLmpwZ3xhIHBpbmVhcHBsZXwmZG89Z2V0XV1gIFtbYXR0YWNobWVudDpIZWxwT25JbWFnZXMvcGluZWFwcGxlLmpwZ3xhIHBpbmVhcHBsZXwmZG89Z2V0XV0NCg0KPT09PSBTZXR0aW5nIGF0dHJpYnV0ZXMgb2YgdGhlIDxhPiB0YWcgPT09PQ0KQXZhaWxhYmxlIGF0dHJpYnV0ZXM6IGNsYXNzLCB0aXRsZSwgdGFyZ2V0LCBhY2Nlc3NrZXkgKHNlZSBzb21lIGh0bWwgcmVmZXJlbmNlIGlmIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGV5IG1lYW4pLg0KDQpFeGFtcGxlOiBgW1todHRwOi8vbW9pbm1vLmluL3xNb2luTW9pbiBXaWtpfGNsYXNzPWdyZWVuIGRvdHRlZCxhY2Nlc3NrZXk9MV1dYA0KDQpSZW5kZXJzIGFzOiBbW2h0dHA6Ly9tb2lubW8uaW4vfE1vaW5Nb2luIFdpa2l8Y2xhc3M9Z3JlZW4gZG90dGVkLGFjY2Vzc2tleT0xXV0NCg0KKCEpIFByZXNzaW5nIHRoZSBhY2Nlc3Mga2V5IHNob3VsZCBqdW1wIHRvIHRoYXQgbGluayB0YXJnZXQgKGZvciBGaXJlZm94IDIueCBhbmQgdGhlIGV4YW1wbGUgYWJvdmUgaXQgaXMgQWx0LVNoaWZ0LTEpLg==</chunk>
-<chunk>DQoNCj09PT0gQ3JlYXRpbmcgYSBxdWVyeSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgVVJMID09PT0NCldoYXQgaXMgcG9zc2libGUgZm9yIHRoaXMgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IHNpdGUuDQoNCkV4YW1wbGU6IGBbW01vaW5Nb2luOk1vaW5Nb2luV2lraXxNb2luTW9pbiBXaWtpfCZhY3Rpb249ZGlmZiwmcmV2MT0xLCZyZXYyPTJdXWANCg0KUmVuZGVycyBhczogW1tNb2luTW9pbjpNb2luTW9pbldpa2k/cmV2MT0xJmFjdGlvbj1kaWZmJnJldjI9MnxNb2luTW9pbiBXaWtpXV0NCg0KKCEpIFBsZWFzZSByZW1lbWJlcjoNCg0KICogSWYgeW91IHdhbnQgdG8gZ2l2ZSBhIGtleT12YWx1ZSBpdGVtIGZvciB0aGUgcXVlcnkgc3RyaW5nLCBkb24ndCBmb3JnZXQgdGhlIGFtcGVyc2FuZCAoJikuDQogKiBHaXZpbmcgcXVlcnkgc3RyaW5nIGl0ZW1zIGRvZXMgbm90IHdvcmsgd2hlbiB5b3UgZ2l2ZSBhIFVSTCBhcyB0YXJnZXQgKGJ1dCBmb3IgbGlua3MgdG8gcGFnZXMgb3IgYXR0YWNobWVudHMpLg0KICogSWYgeW91IGdpdmUgYSBVUkwgYXMgdGFyZ2V0LCB5b3UgY2FuIGluY2x1ZGUgYSBxdWVyeSBzdHJpbmcgZGlyZWN0bHkgaW4gdGhhdCB0YXJnZXQsIG5vIG5lZWQgZm9yIHBhcmFtcy4NCiAqIFlvdSBkb24ndCBuZWVkIHRvIGVuY29kZSBhbmQgdXJsX3F1b3RlIHRoZSBxdWVyeSBzdHJpbmcgc3R1ZmYsIG1vaW4gZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4NCg0KPT09PSBJbWFnZXMgPT09DQpZb3UgbWF5IHVzZQ0KDQp7e3sNCnt7YXR0YWNobWVudDppbWFnZWZpbGUucG5nfHRleHQgZGVzY3JpYmluZyBpbWFnZXx3aWR0aD0xMDB9fQ0KfX19DQp0byBoYXZlIHRoZSBhdHRhY2hlZCBmaWxlIGBpbWFnZWZpbGUucG5nYCBkaXNwbGF5ZWQgd2l0aCBhIHdpZHRoIG9mIDEwMHB4OyB0aGUgZ3JhcGhpY3MnIGhlaWdodCB3aWxsIGJlIHJlZHVjZWQvIGVubGFyZ2VkIHByb3BvcnRpb25hbGx5IChlLmcuIGlmIGBpbWFnZWZpbGUucG5nYCB3YXMgYWN0dWFsbHkgMjAwcHggd2lkdGggYW5kIDQwMHB4IGhlaWdoLCBoZWlnaHQgd291bGQgYmUgcmVkdWNlZCBpbiB0aGlzIGV4YW1wbGUgdG8gMjAwcHgpLiBZb3UgbWF5IGFsc28gdXNlDQoNCnt7ew0Ke3thdHRhY2htZW50OmltYWdlZmlsZS5wbmd8dGV4dCBkZXNjcmliaW5nIGltYWdlfGhlaWdodD0xMDB9fQ0KfX19DQp0byBoYXZlIHRoZSBhdHRhY2hlZCBmaWxlIGBpbWFnZWZpbGUucG5nYCBkaXNwbGF5ZWQgd2l0aCBhIGhlaWdodCBvZiAxMDBweCwgYW5kIHRoZSBncmFwaGljcycgd2lkdGggd2lsbCBiZSByZWR1Y2VkLyBlbmxhcmdlZCBwcm9wb3J0aW9uYWxseS4gVXNlDQoNCnt7ew0Ke3thdHRhY2htZW50OmltYWdlZmlsZS5wbmd8dGV4dCBkZXNjcmliaW5nIGltYWdlfHdpZHRoPTEwMCBoZWlnaHQ9MTUwfX0NCn19fQ0KdG8gaGF2ZSB0aGUgYXR0YWNoZWQgZmlsZSBgaW1hZ2VmaWxlLnBuZ2AgZGlzcGxheWVkIHdpdGggYSB3aWR0aCBvZiAxMDBweCBhbmQgYSBoZWlnaHQgb2YgMTUwcHguIFBsZWFzZSBkbyBub3Qgb21pdCB0aGUgYWx0ZXJuYXRpdmUgdGV4dCBpbiBuZWl0aGVyIGNhc2UuDQoNCk5vdGUgdGhpcyBkb2VzIG5vdCBhbHRlciB0aGUgYXR0YWNoZWQgZmlsZSBpdHNlbGYsIGluIG9ubHkgbWFrZXMgdGhlIGJyb3dzZXIgc2NhbGUgdGhlIGltYWdlIGRvd24vIHVwIHRvIHRoZSB2YWx1ZSBnaXZlbiB3aGlsZSBkaXNwbGF5aW5nIGl0Lg0KDQo9PT09IFRodW1ibmFpbHMgPT09PQ0KWW91IG1heSBjb21iaW5lIHRoZSB0cmFuc2NsdXNpb24gd2l0aCB0aGUgbGlua2luZyBzeW50YXgsIGxlYWRpbmcgdG8gYW4gaW1hZ2UgZGlzcGxheWVkIGluIHJlZHVjZWQgc2l6ZSB0aGF0IGxpbmtzIHRvIGl0c2VsZiBpbiBhY3R1YWwgc2l6ZSwgZS5nLg0KDQp7e3sNCltbYXR0YWNobWVudDppbWFnZWZpbGUucG5nfHt7YXR0YWNobWVudDppbWFnZWZpbGUucG5nfHRleHQgZGVzY3JpYmluZyBpbWFnZXx3aWR0aD0xMDB9fV1dDQp9fX0NCg==</chunk>
-</data>
-</revision>
-</item>
-<item name="FrontPage"><meta></meta>
-<revision revno="0"><meta><entry key="hostname"><str>0.0.0.0</str>
-</entry>
-<entry key="#"><tuple><str>Please edit system and help pages ONLY in the master wiki!</str>
-<str>For more information, please see MoinMoin:MoinDev/Translation.</str>
-<str>master-page:FrontPage</str>
-</tuple>
-</entry>
-<entry key="sha1"><str>836e7743aa94de00274aef973ac24d4e2cd4f69b</str>
-</entry>
-<entry key="userid"><str></str>
-</entry>
-<entry key="name"><str>FrontPage</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="comment"><str></str>
-</entry>
-<entry key="address"><str>0.0.0.0</str>
-</entry>
-<entry key="syspage_version"><int>1</int>
-</entry>
-<entry key="mimetype"><str>text/x.moin.wiki</str>
-</entry>
-<entry key="pragma"><str>section-numbers off</str>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="extra"><str></str>
-</entry>
-<entry key="is_syspage"><bool>True</bool>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBXaWtpTmFtZSBXaWtpID0NCg0KV2hhdCBpcyB0aGlzIHdpa2kgYWJvdXQ/DQoNCkludGVyZXN0aW5nIHN0YXJ0aW5nIHBvaW50czoNCiAqIFJlY2VudENoYW5nZXM6IHNlZSB3aGVyZSBwZW9wbGUgYXJlIGN1cnJlbnRseSB3b3JraW5nDQogKiBXaWtpU2FuZEJveDogZmVlbCBmcmVlIHRvIGNoYW5nZSB0aGlzIHBhZ2UgYW5kIGV4cGVyaW1lbnQgd2l0aCBlZGl0aW5nDQogKiBGaW5kUGFnZTogZmluZCBzb21lIGNvbnRlbnQsIGV4cGxvcmUgdGhlIHdpa2kNCiAqIEhlbHBPbk1vaW5XaWtpU3ludGF4OiBxdWljayBhY2Nlc3MgdG8gd2lraSBtYXJrdXANCg0KDQo9PSBIb3cgdG8gdXNlIHRoaXMgc2l0ZSA9PQ0KDQpBIFdpa2kgaXMgYSBjb2xsYWJvcmF0aXZlIHNpdGUsIGFueW9uZSBjYW4gY29udHJpYnV0ZSBhbmQgc2hhcmU6DQogKiBFZGl0IGFueSBwYWdlIGJ5IHByZXNzaW5nICcnJzw8R2V0VGV4dChFZGl0KT4+JycnIGF0IHRoZSB0b3Agb3IgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSANCiAqIENyZWF0ZSBhIGxpbmsgdG8gYW5vdGhlciBwYWdlIHdpdGggam9pbmVkIGNhcGl0YWxpemVkIHdvcmRzIChsaWtlIFdpa2lTYW5kQm94KSBvciB3aXRoIHt7e1tbd29yZHMgaW4gYnJhY2tldHNdXX19fQ0KICogU2VhcmNoIGZvciBwYWdlIHRpdGxlcyBvciB0ZXh0IHdpdGhpbiBwYWdlcyB1c2luZyB0aGUgc2VhcmNoIGJveCBhdCB0aGUgdG9wIG9mIGFueSBwYWdlDQogKiBTZWUgSGVscEZvckJlZ2lubmVycyB0byBnZXQgeW91IGdvaW5nLCBIZWxwQ29udGVudHMgZm9yIGFsbCBoZWxwIHBhZ2VzLg0KDQpUbyBsZWFybiBtb3JlIGFib3V0IHdoYXQgYSBXaWtpV2lraVdlYiBpcywgcmVhZCBhYm91dCBNb2luTW9pbjpXaHlXaWtpV29ya3MgYW5kIHRoZSBNb2luTW9pbjpXaWtpTmF0dXJlLg0KDQpUaGlzIHdpa2kgaXMgcG93ZXJlZCBieSBbW2h0dHA6Ly9tb2lubW8uaW4vfE1vaW5Nb2luXV0uDQo=</chunk>
-</data>
-</revision>
-</item>
-<item name="HelpOnMoinWikiSyntax"><meta></meta>
-<revision revno="0"><meta><entry key="hostname"><str>0.0.0.0</str>
-</entry>
-<entry key="#"><tuple><str>Please edit system and help pages ONLY in the master wiki!</str>
-<str>For more information, please see MoinMoin:MoinDev/Translation.</str>
-<str>page was renamed from SyntaxReference</str>
-<str>master-page:Unknown-Page</str>
-<str>master-date:Unknown-Date</str>
-</tuple>
-</entry>
-<entry key="sha1"><str>3f61c5a99ce682ca6f4630a6f41af0d5c0784366</str>
-</entry>
-<entry key="userid"><str></str>
-</entry>
-<entry key="name"><str>HelpOnMoinWikiSyntax</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="comment"><str></str>
-</entry>
-<entry key="address"><str>0.0.0.0</str>
-</entry>
-<entry key="acl"><str>-All:write Default</str>
-</entry>
-<entry key="syspage_version"><int>1</int>
-</entry>
-<entry key="mimetype"><str>text/x.moin.wiki</str>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="extra"><str></str>
-</entry>
-<entry key="is_syspage"><bool>True</bool>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBNb2luIFdpa2kgU3ludGF4ID0NCjw8VGFibGVPZkNvbnRlbnRzKCk+Pg0KVGhpcyBwYWdlIGFpbXMgdG8gaW50cm9kdWNlIHRoZSBtb3N0IGltcG9ydGFudCBlbGVtZW50cyBvZiBNb2luTW9pbmBgJ3Mgc3ludGF4IGF0IGEgZ2xhbmNlLCBzaG93aW5nIGZpcnN0IHRoZSBtYXJrdXAgdmVyYmF0aW0gYW5kIHRoZW4gaG93IGl0IGlzIHJlbmRlcmVkIGJ5IHRoZSB3aWtpIGVuZ2luZS4gQWRkaXRpb25hbGx5LCB5b3UnbGwgZmluZCBsaW5rcyB0byB0aGUgcmVsYXRpdmUgaGVscCBwYWdlcy4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIG9mIHRoZSBmZWF0dXJlcyBkZXBlbmQgb24geW91ciBjb25maWd1cmF0aW9uLg0KDQoNCg0KPT0gSGVhZGluZ3MgYW5kIHRhYmxlIG9mIGNvbnRlbnRzID09DQonJycnJ3NlZTonJycgSGVscE9uSGVhZGxpbmVzJycNCnt7ew0KVGFibGUgb2YgY29udGVudHM6DQo8PFRhYmxlT2ZDb250ZW50cygpPj4NCg0KVGFibGUgb2YgY29udGVudHMgKHVwIHRvIDJuZCBsZXZlbCBoZWFkaW5ncyBvbmx5KToNCjw8VGFibGVPZkNvbnRlbnRzKDIpPj4NCg0KPSBoZWFkaW5nIDFzdCBsZXZlbCA9DQo9PSBoZWFkaW5nIDJuZCBsZXZlbCA9PQ0KPT09IGhlYWRpbmcgM3JkIGxldmVsID09PQ0KPT09PSBoZWFkaW5nIDR0aCBsZXZlbCA9PT09DQo9PT09PSBoZWFkaW5nIDV0aCBsZXZlbCA9PT09PQ0KPT09PT09IG5vIGhlYWRpbmcgNnRoIGxldmVsID09PT09PQ0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQpUYWJsZSBvZiBjb250ZW50czoNCjw8VGFibGVPZkNvbnRlbnRzKCk+Pg0KDQpUYWJsZSBvZiBjb250ZW50cyAodXAgdG8gMm5kIGxldmVsIGhlYWRpbmdzIG9ubHkpOg0KPDxUYWJsZU9mQ29udGVudHMoMik+Pg0KDQo9IGhlYWRpbmcgMXN0IGxldmVsID0NCj09IGhlYWRpbmcgMm5kIGxldmVsID09DQo9PT0gaGVhZGluZyAzcmQgbGV2ZWwgPT09DQo9PT09IGhlYWRpbmcgNHRoIGxldmVsID09PT0NCj09PT09IGhlYWRpbmcgNXRoIGxldmVsID09PT09DQo9PT09PT0gbm8gaGVhZGluZyA2dGggbGV2ZWwgPT09PT09DQp9fX0NCg0KPT0gVGV4dCBGb3JtYXR0aW5nID09DQonJycnJ3NlZTonJycgSGVscE9uRm9ybWF0dGluZycnDQp8fDxyb3diZ2NvbG9yPSIjZmZmZmNjIiB3aWR0aD0iNTAlIj4gJycnTWFya3VwJycnIHx8ICcnJ1Jlc3VsdCcnJyAgIHx8DQp8fCAgYCcnaXRhbGljJydgICAgICB8fCAnJ2l0YWxpYycnICAgICAgIHx8DQp8fCAgYCcnJ2JvbGQnJydgICAgICB8fCAnJydib2xkJycnICAgICAgIHx8DQp8fCAge3t7YG1vbm9zcGFjZWB9fX0gfHwgYG1vbm9zcGFjZWAgIHx8DQp8fCAgYHt7e2NvZGV9fX1gICAgICB8fCB7e3tjb2RlfX19ICAgICAgIHx8DQp8fCAgYF9fdW5kZXJsaW5lX19gICB8fCBfX3VuZGVybGluZV9fICAgfHwNCnx8ICBgXnN1cGVyXnNjcmlwdGAgIHx8IF5zdXBlcl5zY3JpcHQgICAgfHwNCnx8ICBgLCxzdWIsLHNjcmlwdGAgIHx8ICwsc3ViLCxzY3JpcHQgICAgfHwNCnx8ICBgfi1zbWFsbGVyLX5gICAgIHx8IH4tc21hbGxlci1+ICAgICB8fA0KfHwgIGB+K2xhcmdlcit+YCAgICAgfHwgfitsYXJnZXIrfiAgICAgICB8fA0KfHwgYC0tKHN0cm9rZSktLWAgICAgfHwgLS0oc3Ryb2tlKS0tICAgICB8fA0KDQoNCj09IEh5cGVybGlua3MgPT0NCicnJycnc2VlOicnJyBIZWxwT25MaW5raW5nJycNCg0KDQo9PT0gSW50ZXJuYWwgTGlua3MgPT09DQp8fDxyb3diZ2NvbG9yPSIjZmZmZmNjIiB3aWR0aD0iNTAlIj4gJycnTWFya3VwJycnIHx8ICcnJ1Jlc3VsdCcnJyB8fA0KfHwgYEZyb250UGFnZWAgfHwgRnJvbnRQYWdlIHx8DQp8fCBgW1tGcm9udFBhZ2VdXWAgfHwgW1tGcm9udFBhZ2VdXSB8fA0KfHwgYEhlbHBPbkVkaXRpbmcvU3ViUGFnZXNgIHx8IEhlbHBPbkVkaXRpbmcvU3ViUGFnZXMgfHwNCnx8IGAvU3ViUGFnZWAgfHwgL1N1YlBhZ2UgfHwNCnx8IGAuLi9TaWJsaW5nUGFnZWAgfHwgLi4vU2libGluZ1BhZ2UgfHwNCnx8IGBbW0Zyb250UGFnZXxuYW1lZCBsaW5rXV1gIHx8IFtbRnJvbnRQYWdlfG5hbWVkIGxpbmtdXSB8fA0KfHwgYFtbI2FuY2hvcm5hbWVdXWAgfHwgW1sjYW5jaG9ybmFtZV1dIHx8DQp8fCBgW1sjYW5jaG9ybmFtZXxkZXNjcmlwdGlvbl1dYCB8fCBbWyNhbmNob3JuYW1lfGRlc2NyaXB0aW9uXV0gfHwNCnx8IGBbW1BhZ2VOYW1lI2FuY2hvcm5hbWVdXWAgfHwgW1tQYWdlTmFtZSNhbmNob3JuYW1lXV0gfHwNCnx8IGBbW1BhZ2VOYW1lI2FuY2hvcm5hbWV8ZGVzY3JpcHRpb25dXWAgfHwgW1tQYWdlTmFtZSNhbmNob3JuYW1lfGRlc2NyaXB0aW9uXV0gfHwNCnx8IGBbW2F0dGFjaG1lbnQ6ZmlsZW5hbWUudHh0XV1gIHx8IFtbYXR0YWNobWVudDpmaWxlbmFtZS50eHRdXSB8fA0KDQoNCj09PSBFeHRlcm5hbCBMaW5rcyA9PT0NCnx8PHJvd2JnY29sb3I9IiNmZmZmY2MiIHdpZHRoPSI1MCUiPiAnJydNYXJrdXAnJycgfHwgJycnUmVzdWx0JycnIHx8DQp8fCBgaHR0cDovL21vaW5tby5pbi9gIHx8IGh0dHA6Ly9tb2lubW8uaW4vIHx8DQp8fCBgW1todHRwOi8vbW9pbm1vLmluL11dYCB8fCBbW2h0dHA6Ly9tb2lubW8uaW4vXV0gfHwNCnx8IGBbW2h0dHA6Ly9tb2lubW8uaW4vfE1vaW5Nb2luIFdpa2ldXWAgfHwgW1todHRwOi8vbW9pbm1vLmluL3xNb2luTW9pbiBXaWtpXV0gfHwNCnx8IGBbW2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ11dYCB8fCBbW2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ11dIHx8DQp8fCBge3todHRwOi8vc3RhdGljLm1vaW5tby5pbi9sb2dvcy9tb2lubW9pbi5wbmd9fWAgfHwge3todHRwOi8vc3RhdGljLm1vaW5tby5pbi9sb2dvcy9tb2lubW9pbi5wbmd9fSB8fA0KfHwgYFtbaHR0cDovL3N0YXRpYy5tb2lubW8uaW4vbG9nb3MvbW9pbm1vaW4ucG5nfG1vaW5tb2luLnBuZ11dYCB8fCBbW2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ3xtb2lubW9pbi5wbmddXSB8fA0KfHwgYE1lYXRCYWxsOkludGVyV2lraWAgfHwgTWVhdEJhbGw6SW50ZXJXaWtpIHx8DQp8fCBgW01lYXRCYWxsOkludGVyV2lraXxJbnRlcldpa2kgcGFnZSBvbiBNZWF0QmFsbF1dYCB8fCBbW01lYXRCYWxsOkludGVyV2lraXxJbnRlcldpa2kgcGFnZSBvbiBNZWF0QmFsbF1dIHx8DQp8fCBgW1tmaWxlOi8vLy8vc2VydmVyL3NoYXJlL2ZpbGVuYW1lJTIwd2l0aCUyMHNwYWNlcy50eHR8bGluayB0byBmaWxlbmFtZS50eHRdXWAgfHwgW1tmaWxlOi8vLy8vc2VydmVyL3NoYXJlL2ZpbGVuYW1lJTIwd2l0aCUyMHNwYWNlcy50eHR8bGluayB0byBmaWxlbmFtZS50eHRdXSB8fA0KfHwgYHVzZXJAZXhhbXBsZS5jb21gIHx8IHVzZXJAZXhhbXBsZS5jb20gfHwNCg0KDQoNCj09PSBBdm9pZCBvciBMaW1pdCBBdXRvbWF0aWMgTGlua2luZyA9PT0NCnx8PHJvd2JnY29sb3I9IiNmZmZmY2MiIHdpZHRoPSI1MCUiPiAnJydNYXJrdXAnJycgfHwgJycnUmVzdWx0JycnIHx8DQp8fCBgV2lraScnJycnJ05hbWVgIHx8IFdpa2knJycnJydOYW1lIHx8DQp8fCB7e3tXaWtpYGBOYW1lfX19IHx8IFdpa2lgYE5hbWUgfHwNCnx8IGAhV2lraU5hbWVgIHx8ICFXaWtpTmFtZSB8fA0KfHwgYFdpa2lOYW1lJycnJycnc2AgfHwgV2lraU5hbWUnJycnJydzIHx8DQp8fCB7e3tXaWtpTmFtZWBgc319fSB8fCBXaWtpTmFtZWBgcyB8fA0KfHwge3t7YGh0dHA6Ly93d3cuZXhhbXBsZS5jb21gfX19IHx8IGBodHRwOi8vd3d3LmV4YW1wbGUuY29tYCB8fA0KfHwgYFtbaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dXW5vdGxpbmtlZGAgfHwgW1todHRwOi8vd3d3LmV4YW1wbGUuY29tL11dbm90bGlua2VkIHx8DQoNCg0KPT0gRHJhd2luZ3MgPT0NCicnJycnc2VlOicnJyBIZWxwT25EcmF3aW5ncycnDQo9PT0gVFdpa2lEcmF3ID09PQ0KIHt7ZHJhd2luZzpteWV4YW1wbGV9fQ0KDQo9PT0gQW55V2lraURyYXcgPT09DQoge3tkcmF3aW5nOm15ZXhhbXBsZS5hZHJhd319DQoNCj09IEJsb2NrcXVvdGVzIGFuZCBJbmRlbnRhdGlvbnMgPT0NCnt7ew0KIGluZGVudGVkIHRleHQNCiAgdGV4dCBpbmRlbnRlZCB0byB0aGUgMm5kIGxldmVsDQp9fX0NCnt7eyMhd2lraSBkYXNoZWQNCiBpbmRlbg==</chunk>
-<chunk>dGVkIHRleHQNCiAgdGV4dCBpbmRlbnRlZCB0byB0aGUgMm5kIGxldmVsDQp9fX0NCg0KPT0gTGlzdHMgPT0NCicnJycnc2VlOicnJyBIZWxwT25MaXN0cycnDQo9PT0gVW5vcmRlcmVkIExpc3RzID09PQ0Ke3t7DQogKiBpdGVtIDENCg0KICogaXRlbSAyIChwcmVjZWRpbmcgd2hpdGUgc3BhY2UpDQogICogaXRlbSAyLjENCiAgICogaXRlbSAyLjEuMQ0KICogaXRlbSAzDQogIC4gaXRlbSAzLjEgKGJ1bGxldGxlc3MpDQogLiBpdGVtIDQgKGJ1bGxldGxlc3MpDQogICogaXRlbSA0LjENCiAgIC4gaXRlbSA0LjEuMSAoYnVsbGV0bGVzcykNCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KICogaXRlbSAxDQoNCiAqIGl0ZW0gMiAocHJlY2VkaW5nIHdoaXRlIHNwYWNlKQ0KICAqIGl0ZW0gMi4xDQogICAqIGl0ZW0gMi4xLjENCiAqIGl0ZW0gMw0KICAuIGl0ZW0gMy4xIChidWxsZXRsZXNzKQ0KIC4gaXRlbSA0IChidWxsZXRsZXNzKQ0KICAqIGl0ZW0gNC4xDQogICAuIGl0ZW0gNC4xLjEgKGJ1bGxldGxlc3MpDQp9fX0NCg0KPT09IE9yZGVyZWQgTGlzdHMgPT09DQo9PT09IHdpdGggTnVtYmVycyA9PT09DQp7e3sNCiAxLiBpdGVtIDENCiAgIDEuIGl0ZW0gMS4xDQogICAxLiBpdGVtIDEuMg0KIDEuIGl0ZW0gMg0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQogMS4gaXRlbSAxDQogICAxLiBpdGVtIDEuMQ0KICAgMS4gaXRlbSAxLjINCiAxLiBpdGVtIDINCn19fQ0KPT09PSB3aXRoIFJvbWFuIE51bWJlcnMgPT09PQ0Ke3t7DQogSS4gaXRlbSAxDQogICBpLiBpdGVtIDEuMQ0KICAgaS4gaXRlbSAxLjINCiBJLiBpdGVtIDINCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KIEkuIGl0ZW0gMQ0KICAgaS4gaXRlbSAxLjENCiAgIGkuIGl0ZW0gMS4yDQogSS4gaXRlbSAyDQp9fX0NCg0KPT09PSB3aXRoIExldHRlcnMgPT09PQ0Ke3t7DQogQS4gaXRlbSBBDQogICBhLiBpdGVtIEEuIGEpDQogICBhLiBpdGVtIEEuIGIpDQogQS4gaXRlbSBCDQp9fX0NCnt7eyMhd2lraSBkYXNoZWQNCiBBLiBpdGVtIEENCiAgIGEuIGl0ZW0gQS4gYSkNCiAgIGEuIGl0ZW0gQS4gYikNCiBBLiBpdGVtIEINCn19fQ0KPT09IERlZmluaXRpb24gTGlzdHMgPT09DQp7e3sNCiB0ZXJtOjogZGVmaW5pdGlvbg0KIG9iamVjdDo6DQogOjogZGVzY3JpcHRpb24gMQ0KIDo6IGRlc2NyaXB0aW9uIDINCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KIHRlcm06OiBkZWZpbml0aW9uDQogb2JqZWN0OjoNCiA6OiBkZXNjcmlwdGlvbiAxDQogOjogZGVzY3JpcHRpb24gMg0KfX19DQoNCj09IEhvcml6b250YWwgUnVsZXMgPT0NCicnJycnc2VlOicnJyBIZWxwT25SdWxlcycnDQp7e3sNCi0tLS0NCi0tLS0tDQotLS0tLS0NCi0tLS0tLS0NCi0tLS0tLS0tDQotLS0tLS0tLS0NCi0tLS0tLS0tLS0NCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KLS0tLQ0KLS0tLS0NCi0tLS0tLQ0KLS0tLS0tLQ0KLS0tLS0tLS0NCi0tLS0tLS0tLQ0KLS0tLS0tLS0tLQ0KfX19DQoNCj09IFRhYmxlcyA9PQ0KJycnJydzZWU6JycnIEhlbHBPblRhYmxlcycnDQo9PT0gVGFibGVzID09PQ0Ke3t7DQp8fCcnJ0EnJyd8fCcnJ0InJyd8fCcnJ0MnJyd8fA0KfHwxICAgICAgfHwyICAgICAgfHwzICAgICAgfHwNCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KfHwnJydBJycnfHwnJydCJycnfHwnJydDJycnfHwNCnx8MSAgICAgIHx8MiAgICAgIHx8MyAgICAgIHx8DQp9fX0NCj09PSBDZWxsIFdpZHRoID09PQ0Ke3t7DQp8fG1pbmltYWwgd2lkdGggfHw8OTklPm1heGltYWwgd2lkdGggfHwNCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KfHxtaW5pbWFsIHdpZHRoIHx8PDk5JT5tYXhpbWFsIHdpZHRoIHx8DQp9fX0NCg0KPT09IFNwYW5uaW5nIFJvd3MgYW5kIENvbHVtbnMgID09PQ0Ke3t7DQp8fDx8Mj4gY2VsbCBzcGFubmluZyAyIHJvd3MgfHxjZWxsIGluIHRoZSAybmQgY29sdW1uIHx8DQp8fGNlbGwgaW4gdGhlIDJuZCBjb2x1bW4gb2YgdGhlIDJuZCByb3cgfHwNCnx8PC0yPiBjZWxsIHNwYW5uaW5nIDIgY29sdW1ucyB8fA0KfHx8fHVzZSBlbXB0eSBjZWxscyBhcyBhIHNob3J0aGFuZCB8fA0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQp8fDx8Mj4gY2VsbCBzcGFubmluZyAyIHJvd3MgfHxjZWxsIGluIHRoZSAybmQgY29sdW1uIHx8DQp8fGNlbGwgaW4gdGhlIDJuZCBjb2x1bW4gb2YgdGhlIDJuZCByb3cgfHwNCnx8PC0yPiBjZWxsIHNwYW5uaW5nIDIgY29sdW1ucyB8fA0KfHx8fHVzZSBlbXB0eSBjZWxscyBhcyBhIHNob3J0aGFuZCB8fA0KfX19DQoNCj09PSBBbGlnbm1lbnQgb2YgQ2VsbCBDb250ZW50cyA9PT0NCnt7ew0KfHw8XnwzPiB0b3AgKGNvbWJpbmVkKSB8fDw6OTklPiBjZW50ZXIgKGNvbWJpbmVkKSB8fDx2fDM+IGJvdHRvbSAoY29tYmluZWQpIHx8DQp8fDwpPiByaWdodCB8fA0KfHw8KD4gbGVmdCB8fA0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQp8fDxefDM+IHRvcCAoY29tYmluZWQpIHx8PDo5OSU+IGNlbnRlciAoY29tYmluZWQpIHx8PHZ8Mz4gYm90dG9tIChjb21iaW5lZCkgfHwNCnx8PCk+IHJpZ2h0IHx8DQp8fDwoPiBsZWZ0IHx8DQp9fX0NCg0KPT09IENvbG91cmVkIFRhYmxlIENlbGxzID09PQ0Ke3t7DQp8fDwjMDAwMEZGPiBibHVlIHx8PCMwMEZGMDA+IGdyZWVuICAgIHx8PCNGRjAwMDA+IHJlZCAgICB8fA0KfHw8IzAwRkZGRj4gY3lhbiB8fDwjRkYwMEZGPiBtYWdlbnRhICB8fDwjRkZGRjAwPiB5ZWxsb3cgfHwNCn19fQ0Ke3t7IyF3aWtpIGRhc2hlZA0KfHw8IzAwMDBGRj4gYmx1ZSB8fDwjMDBGRjAwPiBncmVlbiAgICB8fDwjRkYwMDAwPiByZWQgICAgfHwNCnx8PCMwMEZGRkY+IGN5YW4gfHw8I0ZGMDBGRj4gbWFnZW50YSAgfHw8I0ZGRkYwMD4geWVsbG93IHx8DQp9fX0NCg0KPT09IEhUTUwtbGlrZSBPcHRpb25zIGZvciBUYWJsZXMgPT09DQp7e3sNCnx8QSB8fDxyb3dzcGFuPSIyIj4gbGlrZSA8fDI+IHx8DQp8fDxiZ2NvbG9yPSIjMDBGRjAwIj4gbGlrZSA8IzAwRkYwMD4gfHwNCnx8PGNvbHNwYW49IjIiPiBsaWtlIDwtMj58fA0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQp8fEEgfHw8cm93c3Bhbj0iMiI+IGxpa2UgPHwyPiB8fA0KfHw8Ymdjb2xvcj0iIzAwRkYwMCI+IGxpa2UgPCMwMEZGMDA+IHx8DQp8fDxjb2xzcGFuPSIyIj4gbGlrZSA8LTI+fHwNCn19fQ0KDQo9PSBNYWNyb3MgYW5kIFZhcmlhYmxlcyA9PQ0KPT09IE1hY3JvcyA9PT0NCicnJycnc2VlOicnJyBIZWxwT25NYWNyb3MnJw0KICogPDxBbmNob3IoYW5jaG9ybmFtZSk+PmA8PEFuY2hvcihhbmNob3JuYW1lKT4+YCBpbnNlcnRzIGEgbGluayBhbmNob3IgYGFuY2hvcm5hbWVgDQogKiBgPDxCUj4+YCBpbnNlcnRzIGEgaGFyZCBsaW5lIGJyZWFrDQogKiBgPDxGb290Tm90ZShOb3RlKT4+YCBpbnNlcnRzIGEgZm9vdG5vdGUgc2F5aW5nIGBOb3RlYA0KICogYDw8SW5jbHVkZShIZWxwT25NYWNyb3MvSW5jbHVkZSk+PmAgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgYEhlbHBPbk1hY3Jvcy9JbmNsdWRlYCBpbmxpbmUNCiAqIGA8PE1haWxUbyh1c2VyIEFUIGV4YW1wbGUgRE9UIGNvbSk+PmAgb2JmdXNjYXRlcyB0aGUgZW1haWwgYWRkcmVzcyBgdXNlckBleGFtcGxlLmNvbWAgdG8gdXNlcnMgbm90IGxvZ2dlZCBpbg0KDQo9PT0gVmFyaWFibGVzID09PQ0KJycnJydzZWU6JycnIEhlbHBPblZhcmlhYmxlcycnDQogKiBgQGBgU0lHYGBAYCBpbnNlcnRzIHlvdXIgbG9naW4gbmFtZSBhbmQgdGltZXN0YW1wIG9mIG1vZGlmaWNhdGlvbg0KICogYEBgYFRJTUVgYEBgIGluc2VydHMgZGF0ZSBhbmQgdGltZSBvZiBtb2RpZmljYXRpb24NCg0KPT0gU21pbGV5cyBhbmQgSWNvbnMgPT0NCicnJycnc2VlOicnJyBIZWxwT25TbWlsZXlzJycNCjw8U2hvd1NtaWxleXM+Pg0KDQo9PSBQYXJzZXJzID09DQonJycnJ3NlZTonJycgSGVscE9uUGFyc2VycycnDQoNCj09PSBWZXJiYXRpbSBEaXNwbGF5ID09PQ0Ke3t7ew0Ke3t7DQpkZWYgaGVsbG8oKToNCiAgICBwcmludCAiSGVsbG8gV29ybGQhIg0KfX19DQp9fX19DQoNCnt7ew0KZGVmIGhlbGxvKCk6DQogICAgcHJpbnQgIkhlbGxvIFdvcmxkISINCn19fQ0KDQo9PT0gU3ludGF4IEhpZ2hsaWdodGluZyA9PT0NCnt7e3sNCnt7eyMhaGlnaA==</chunk>
-<chunk>bGlnaHQgcHl0aG9uDQpkZWYgaGVsbG8oKToNCiAgICBwcmludCAiSGVsbG8gV29ybGQhIg0KfX19DQp9fX19DQoNCnt7eyMhaGlnaGxpZ2h0IHB5dGhvbg0KZGVmIGhlbGxvKCk6DQogICAgcHJpbnQgIkhlbGxvIFdvcmxkISINCn19fQ0KDQo9PT0gVXNpbmcgdGhlIHdpa2kgcGFyc2VyIHdpdGggY3NzIGNsYXNzZXMgPT09DQp7e3t7DQp7e3sjIXdpa2kgcmVkL3NvbGlkDQpUaGlzIGlzIHdpa2kgbWFya3VwIGluIGEgJycnZGl2JycnIHdpdGggX19jc3NfXyBgY2xhc3M9InJlZCBzb2xpZCJgLg0KfX19DQp9fX19DQoNCnt7eyMhd2lraSByZWQvc29saWQNClRoaXMgaXMgd2lraSBtYXJrdXAgaW4gYSAnJydkaXYnJycgd2l0aCBfX2Nzc19fIGBjbGFzcz0icmVkIHNvbGlkImAuDQp9fX0NCg0KPT0gQWRtb25pdGlvbnMgPT0NCicnJycnc2VlOicnJyBIZWxwT25BZG1vbml0aW9ucycnDQoNCnt7e3sNCnt7eyMhd2lraSBjYXV0aW9uDQonJydEb24ndCBvdmVydXNlIGFkbW9uaXRpb25zJycnDQoNCkFkbW9uaXRpb25zIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gQSBwYWdlIHJpZGRsZWQgd2l0aCBhZG1vbml0aW9ucyB3aWxsIGxvb2sgcmVzdGxlc3MgYW5kIHdpbGwgYmUgaGFyZGVyIHRvIGZvbGxvdyB0aGFuIGEgcGFnZSB3aGVyZSBhZG1vbml0aW9ucyBhcmUgdXNlZCBzcGFyaW5nbHkuDQp9fX0NCn19fX0NCg0Ke3t7IyF3aWtpIGNhdXRpb24NCicnJ0Rvbid0IG92ZXJ1c2UgYWRtb25pdGlvbnMnJycNCg0KQWRtb25pdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBBIHBhZ2UgcmlkZGxlZCB3aXRoIGFkbW9uaXRpb25zIHdpbGwgbG9vayByZXN0bGVzcyBhbmQgd2lsbCBiZSBoYXJkZXIgdG8gZm9sbG93IHRoYW4gYSBwYWdlIHdoZXJlIGFkbW9uaXRpb25zIGFyZSB1c2VkIHNwYXJpbmdseS4NCn19fQ0KDQoNCj09IENvbW1lbnRzID09DQonJycnJ3NlZTonJycgSGVscE9uQ29tbWVudHMnJw0KDQp7e3sNCkNsaWNrIG9uICJDb21tZW50cyIgaW4gZWRpdCBiYXIgdG8gdG9nZ2xlIHRoZSAvKiBjb21tZW50cyAqLyB2aXNpYmlsaXR5Lg0KfX19DQp7e3sjIXdpa2kgZGFzaGVkDQpDbGljayBvbiAiQ29tbWVudHMiIGluIGVkaXQgYmFyIHRvIHRvZ2dsZSB0aGUgLyogY29tbWVudHMgKi8gdmlzaWJpbGl0eS4NCn19fQ0KDQoNCnt7e3sNCnt7eyMhd2lraSBjb21tZW50L2Rhc2hlZA0KVGhpcyBpcyBhIHdpa2kgcGFyc2VyIHNlY3Rpb24gd2l0aCBjbGFzcyAiY29tbWVudCBkYXNoZWQiIChzZWUgSGVscE9uUGFyc2VycykuDQoNCkl0cyB2aXNpYmlsaXR5IGdldHMgdG9nZ2xlZCB0aGUgc2FtZSB3YXkuDQp9fX0NCn19fX0NCg0Ke3t7IyF3aWtpIGNvbW1lbnQvZGFzaGVkDQpUaGlzIGlzIGEgd2lraSBwYXJzZXIgc2VjdGlvbiB3aXRoIGNsYXNzICJjb21tZW50IGRhc2hlZCIgKHNlZSBIZWxwT25QYXJzZXJzKS4NCg0KSXRzIHZpc2liaWxpdHkgZ2V0cyB0b2dnbGVkIHRoZSBzYW1lIHdheS4NCn19fQ0K</chunk>
-</data>
-</revision>
-</item>
-</backend>
--- a/MoinMoin/conftest.py	Sun Sep 25 18:25:26 2011 +0200
+++ b/MoinMoin/conftest.py	Mon Sep 26 02:38:29 2011 +0200
@@ -39,7 +39,7 @@
 MoinMoin.log.load_config(config_file)
 
 from MoinMoin.app import create_app_ext, destroy_app, before_wiki, teardown_wiki
-from MoinMoin._tests import maketestwiki, wikiconfig
+from MoinMoin._tests import wikiconfig
 from MoinMoin.storage import create_simple_mapping
 from flask import g as flaskg
 
--- a/MoinMoin/script/__init__.py	Sun Sep 25 18:25:26 2011 +0200
+++ b/MoinMoin/script/__init__.py	Mon Sep 26 02:38:29 2011 +0200
@@ -43,8 +43,9 @@
     manager.add_command("maint_reduce_revisions", Reduce_Revisions())
     from MoinMoin.script.maint.set_meta import Set_Meta
     manager.add_command("maint_set_meta", Set_Meta())
-    from MoinMoin.script.maint.create_item import Create_Item
-    manager.add_command("maint_create_item", Create_Item())
+    from MoinMoin.script.maint import modify_item
+    manager.add_command("item-get", modify_item.GetItem())
+    manager.add_command("item-put", modify_item.PutItem())
     from MoinMoin.script.maint.modified_systemitems import Modified_SystemItems
     manager.add_command("maint_modified_systemitems", Modified_SystemItems())
 
--- a/MoinMoin/script/maint/create_item.py	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# Copyright: 2011 MoinMoin:ReimarBauer
-# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.
-
-"""
-    MoinMoin - creates an item
-
-    This script creates a new revision of an item.
-"""
-
-
-from flask import current_app as app
-from flask import g as flaskg
-from flaskext.script import Command, Option
-
-from MoinMoin.config import NAME, ACTION, CONTENTTYPE
-from MoinMoin.storage.error import ItemAlreadyExistsError, NoSuchItemError
-
-
-class Create_Item(Command):
-    description = 'This command can be used to create an item'
-    option_list = (
-        Option('--name', '-n', dest='name', type=unicode, required=True,
-            help='Name of the item to create'),
-        Option('--file', '-f', dest='data_file', type=unicode, required=True,
-            help='Filename of file to read in and store as item.'),
-        Option('--content-type', '-m', dest='contenttype', type=unicode, required=True,
-            help='content-type of item'),
-        Option('--comment', '-c', dest='comment', type=unicode,
-            help='comment for item')
-    )
-
-    def run(self, name, data_file, contenttype, comment):
-        storage = app.unprotected_storage
-        rev_no = -1
-        try:
-            item = storage.create_item(name)
-        except ItemAlreadyExistsError:
-            item = storage.get_item(name)
-            currentrev = item.get_revision(-1)
-            rev_no = currentrev.revno
-        rev = item.create_revision(rev_no + 1)
-        rev[ACTION] = u'SAVE'
-        rev[NAME] = name
-        rev[CONTENTTYPE] = contenttype
-        with open(data_file, 'rb') as data:
-            rev.write(data.read())
-            item.commit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/script/maint/modify_item.py	Mon Sep 26 02:38:29 2011 +0200
@@ -0,0 +1,75 @@
+# Copyright: 2011 MoinMoin:ThomasWaldmann
+# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.
+
+"""
+MoinMoin - get an item revision from the wiki, put it back into the wiki.
+"""
+
+import shutil
+
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
+
+from flask import current_app as app
+from flask import g as flaskg
+from flaskext.script import Command, Option
+
+from MoinMoin.config import NAME, CURRENT, REVID, DATAID, SIZE, HASH_ALGORITHM
+
+
+class GetItem(Command):
+    description = 'Get an item revision from the wiki.'
+    option_list = (
+        Option('--name', '-n', dest='name', type=unicode, required=True,
+            help='Name of the item to get.'),
+        Option('--revid', '-r', dest='revid', type=unicode, required=False, default=CURRENT,
+            help='Revision ID of the revision to get (default: current rev).'),
+        Option('--meta', '-m', dest='meta_file', type=unicode, required=True,
+            help='Filename of file to create for the metadata.'),
+        Option('--data', '-d', dest='data_file', type=unicode, required=True,
+            help='Filename of file to create for the data.'),
+    )
+
+    def run(self, name, meta_file, data_file, revid):
+        item = app.storage[name]
+        rev = item[revid]
+        meta = json.dumps(dict(rev.meta), sort_keys=True, indent=2, ensure_ascii=False)
+        meta = meta.encode('utf-8')
+        with open(meta_file, 'wb') as mf:
+            mf.write(meta)
+        with open(data_file, 'wb') as df:
+            shutil.copyfileobj(rev.data, df)
+
+
+class PutItem(Command):
+    description = 'Put an item revision into the wiki.'
+    option_list = (
+        Option('--meta', '-m', dest='meta_file', type=unicode, required=True,
+            help='Filename of file to read as metadata.'),
+        Option('--data', '-d', dest='data_file', type=unicode, required=True,
+            help='Filename of file to read as data.'),
+        Option('--overwrite', '-o', action='store_true', dest='overwrite', default=False,
+            help='If given, overwrite existing revisions, if requested.'),
+    )
+
+    def run(self, meta_file, data_file, overwrite):
+        with open(meta_file, 'rb') as mf:
+            meta = mf.read()
+        meta = meta.decode('utf-8')
+        meta = json.loads(meta)
+        name = meta[NAME]
+        to_kill = [SIZE, HASH_ALGORITHM, # gets re-computed automatically
+                   DATAID,
+                  ]
+        for key in to_kill:
+            meta.pop(key, None)
+        if not overwrite:
+            # if we remove the REVID, it will create a new one and store under the new one
+            meta.pop(REVID, None)
+        item = app.storage[name]
+        with open(data_file, 'rb') as df:
+            item.store_revision(meta, df, overwrite=overwrite)
+
--- a/MoinMoin/storage/backends/stores.py	Sun Sep 25 18:25:26 2011 +0200
+++ b/MoinMoin/storage/backends/stores.py	Mon Sep 26 02:38:29 2011 +0200
@@ -152,6 +152,9 @@
             dataid = meta[DATAID]
             # we will just asume stuff is correct if you pass it with a data id
             if dataid not in self.data_store:
+                # XXX issue: if we do not store if we already have the dataid in the store,
+                # XXX deserialization does not work as the fpos does not advance to the next record,
+                # XXX because we do not read from the source file. Remove the check?
                 self.data_store[dataid] = data
         # if something goes wrong below, the data shall be purged by a garbage collection
         metaid = self._store_meta(meta)
--- a/MoinMoin/storage/middleware/indexing.py	Sun Sep 25 18:25:26 2011 +0200
+++ b/MoinMoin/storage/middleware/indexing.py	Mon Sep 26 02:38:29 2011 +0200
@@ -91,7 +91,6 @@
     :param wikiname: interwikiname of this wiki
     :returns: document to put into whoosh index
     """
-
     doc = dict([(str(key), value)
                 for key, value in meta.items()
                 if key in schema])
@@ -149,7 +148,7 @@
             # unmodified list of TAGS from metadata
             TAGS: ID(stored=True),
             LANGUAGE: ID(stored=True),
-            # USERID from metadata TODO: -> user ITEMID
+            # USERID from metadata
             USERID: ID(stored=True),
             # ADDRESS from metadata
             ADDRESS: ID(stored=True),
@@ -390,7 +389,7 @@
         index = open_dir(index_dir, indexname=ALL_REVS)
         try:
             # build an index of all we have (so we know what we have)
-            all_revids = self.backend # the backend is a iterator over all revids
+            all_revids = self.backend # the backend is an iterator over all revids
             self._modify_index(index, self.schemas[ALL_REVS], self.wikiname, all_revids, 'add', procs, limitmb)
             latest_revids = self._find_latest_revids(index)
         finally:
@@ -459,7 +458,6 @@
         """
         Optimize whoosh index.
         """
-        # XXX unclear: do we need to close the index before optimizing it? or lock it so it is not used otherwise?
         for name in self.ix:
             self.ix[name].optimize()
 
--- a/MoinMoin/util/_tests/test_pycdb.py	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright: 2011 Prashant Kumar <contactprashantat AT gmail DOT com>
-# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.
-
-"""
-MoinMoin - MoinMoin.util.pycdb Tests
-"""
-
-import os
-import shutil, tempfile
-
-import pytest
-from MoinMoin.util import pycdb
-
-class TestCDBMaker(object):
-    """ Test: util.pycdb.CDBMaker """
-
-    def setup_method(self, method):
-        self.test_dir = tempfile.mkdtemp('', 'test_cdb')
-        self.test_tmpname = os.path.join(self.test_dir, "test_tmpfile")
-        self.test_cdbname = os.path.join(self.test_dir, "test_cdbfile")
-        self.CDBMaker_obj = pycdb.CDBMaker(self.test_cdbname, self.test_tmpname)
-
-    def teardown_method(self, method):
-        shutil.rmtree(self.test_dir)
-
-    def test_add(self):
-        result = os.listdir(self.test_dir)
-        result1 = self.CDBMaker_obj.__len__()
-        expected = ['test_tmpfile']
-        assert result == expected
-
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value - ', 'v_value')
-        self.CDBMaker_obj._fp = open(self.test_tmpname, 'r')
-        # seek to 2048 since self._pos was assigned to 2048 initially.
-        self.CDBMaker_obj._fp.seek(2048)
-        # read the contents i.e. newly added contents
-        result = self.CDBMaker_obj._fp.read()
-        expected = '\x0b\x00\x00\x00\x07\x00\x00\x00 k_value - v_value'
-        assert result == expected
-
-    def test_finish(self):
-        # add contents to cdb_file
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value - ', 'v_value')
-        # remove tmpfile
-        self.CDBMaker_obj.finish()
-        result = os.listdir(self.test_dir)
-        expected = ['test_cdbfile']
-        assert result == expected
-
-class TestCDBReader(object):
-    """ Test: util.pycdb.CDBReader """
-
-    def setup_method(self, method):
-        self.test_dir = tempfile.mkdtemp('', 'test_cdb')
-        self.test_tmpname = os.path.join(self.test_dir, "test_tmpfile")
-        self.test_cdbname = os.path.join(self.test_dir, "test_cdbfile")
-        self.CDBMaker_obj = pycdb.CDBMaker(self.test_cdbname, self.test_tmpname)
-        # add k and v
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value - ', 'v_value')
-
-    def teardown_method(self, method):
-        shutil.rmtree(self.test_dir)
-
-    def test_get(self):
-        # remove tmpfile
-        self.CDBMaker_obj.finish()
-
-        CDBReader_obj = pycdb.CDBReader(self.test_cdbname)
-        result = CDBReader_obj.get(' k_value - ', failed=None)
-        expected = 'v_value'
-        assert result == expected
-
-        # invalid key
-        result = CDBReader_obj.get('invalid_key', failed='no_such_value')
-        expected = 'no_such_value'
-        assert result == expected
-
-    def test_keys(self):
-        """ test all key realated functions """
-        # add next value
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value_next - ', 'v_value_next')
-        # remove tmpfile
-        self.CDBMaker_obj.finish()
-
-        CDBReader_obj = pycdb.CDBReader(self.test_cdbname)
-        # test: has_key
-        result = CDBReader_obj.has_key(' k_value - ')
-        assert result
-        # test: invalidkey
-        result = CDBReader_obj.has_key('not_present')
-        assert not result
-
-        # test: firstkey
-        result = CDBReader_obj.firstkey()
-        expected = ' k_value - '
-        assert result == expected
-
-        # test: nextkey
-        result = CDBReader_obj.nextkey()
-        expected = ' k_value_next - '
-        assert result == expected
-
-        # test: iterkeys
-        test_keys = CDBReader_obj.iterkeys()
-        result = []
-        [result.append(key) for key in test_keys]
-        expected = [' k_value - ', ' k_value_next - ']
-        assert expected == result
-
-    def test_itervalues(self):
-        # add next value
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value_next - ', 'v_value_next')
-        # remove tmpfile
-        self.CDBMaker_obj.finish()
-
-        CDBReader_obj = pycdb.CDBReader(self.test_cdbname)
-        test_values = CDBReader_obj.itervalues()
-        result = []
-        [result.append(value) for value in test_values]
-        expected = ['v_value', 'v_value_next']
-        assert expected == result
-
-    def test_iteritems(self):
-        # add next value
-        self.CDBMaker_obj = self.CDBMaker_obj.add(' k_value_next - ', 'v_value_next')
-        # remove tmpfile
-        self.CDBMaker_obj.finish()
-
-        CDBReader_obj = pycdb.CDBReader(self.test_cdbname)
-        test_items = CDBReader_obj.iteritems()
-        result = []
-        [result.append(item) for item in test_items]
-        expected = [(' k_value - ', 'v_value'), (' k_value_next - ', 'v_value_next')]
-        assert expected == result
-
--- a/MoinMoin/util/pycdb.py	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-# Copyright: Yusuke Shinyama (author)
-# Copyright: Johannes Berg (coding style fixes and tcdb removal)
-# License: Public Domain
-
-"""
-pycdb.py - Python implementation of cdb
-"""
-
-
-import os
-from struct import pack, unpack
-from array import array
-
-
-def cdbhash(s, n=0L):
-    """calc hash value with a given key"""
-    return reduce(lambda h, c: ((h * 33) ^ ord(c)) & 0xffffffffL, s, n + 5381L)
-
-if pack('=i', 1) == pack('>i', 1):
-    def decode(x):
-        a = array('I', x)
-        a.byteswap()
-        return a
-    def encode(a):
-        a.byteswap()
-        return a.tostring()
-else:
-    def decode(x):
-        a = array('I', x)
-        return a
-    def encode(a):
-        return a.tostring()
-
-
-def cdbiter(fp, eod):
-    kloc = 2048
-    while kloc < eod:
-        fp.seek(kloc)
-        (klen, vlen) = unpack('<II', fp.read(8))
-        k = fp.read(klen)
-        v = fp.read(vlen)
-        kloc += 8 + klen + vlen
-        yield (k, v)
-    fp.close()
-
-
-class CDBReader:
-    def __init__(self, cdbname, docache=1):
-        self.name = cdbname
-        self._fp = file(cdbname, 'rb')
-        hash0 = decode(self._fp.read(2048))
-        self._hash0 = [(hash0[i], hash0[i+1]) for i in xrange(0, 512, 2)]
-        self._hash1 = [None ] * 256
-        self._eod = hash0[0]
-        self._docache = docache
-        self._cache = {}
-        self._keyiter = None
-        self._eachiter = None
-
-    def close(self):
-        if self._fp:
-            self._fp.close()
-            self._fp = None
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, type, value, traceback):
-        self.close()
-
-    def __getstate__(self):
-        raise TypeError
-
-    def __setstate__(self, dict):
-        raise TypeError
-
-    def __getitem__(self, k):
-        k = str(k)
-        if k in self._cache:
-            return self._cache[k]
-        h = cdbhash(k)
-        h1 = h & 0xff
-        (pos_bucket, ncells) = self._hash0[h1]
-        if ncells == 0:
-            raise KeyError(k)
-        hs = self._hash1[h1]
-        if hs is None:
-            self._fp.seek(pos_bucket)
-            hs = decode(self._fp.read(ncells * 8))
-            self._hash1[h1] = hs
-        i = ((h >> 8) % ncells) * 2
-        n = ncells * 2
-        for _ in xrange(ncells):
-            p1 = hs[i + 1]
-            if p1 == 0: raise KeyError(k)
-            if hs[i] == h:
-                self._fp.seek(p1)
-                (klen, vlen) = unpack('<II', self._fp.read(8))
-                k1 = self._fp.read(klen)
-                if k1 == k:
-                    v1 = self._fp.read(vlen)
-                    if self._docache:
-                        self._cache[k] = v1
-                    return v1
-            i = (i + 2) % n
-        raise KeyError(k)
-
-    def get(self, k, failed=None):
-        try:
-            return self.__getitem__(k)
-        except KeyError:
-            return failed
-
-    def has_key(self, k):
-        try:
-            self.__getitem__(k)
-            return True
-        except KeyError:
-            return False
-
-    def __contains__(self, k):
-        return self.has_key(k)
-
-    def firstkey(self):
-        self._keyiter = None
-        return self.nextkey()
-
-    def nextkey(self):
-        if not self._keyiter:
-            self._keyiter = (k for (k, v) in cdbiter(self._fp, self._eod))
-        try:
-            return self._keyiter.next()
-        except StopIteration:
-            return None
-
-    def each(self):
-        if not self._eachiter:
-            self._eachiter = cdbiter(self._fp, self._eod)
-        try:
-            return self._eachiter.next()
-        except StopIteration:
-            return None
-
-    def iterkeys(self):
-        return (k for (k, v) in cdbiter(self._fp, self._eod))
-
-    def itervalues(self):
-        return (v for (k, v) in cdbiter(self._fp, self._eod))
-
-    def iteritems(self):
-        return cdbiter(self._fp, self._eod)
-
-
-class CDBMaker:
-    def __init__(self, cdbname, tmpname):
-        self.fn = cdbname
-        self.fntmp = tmpname
-        self.numentries = 0
-        self._fp = file(tmpname, 'wb')
-        self._pos = 2048
-        self._bucket = [array('I') for _ in xrange(256)]
-
-    def close(self):
-        # you don't need to call this if you called finish()
-        if self._fp:
-            self._fp.close()
-            self._fp = None
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, type, value, traceback):
-        self.finish()
-
-    def __len__(self):
-        return self.numentries
-
-    def __getstate__(self):
-        raise TypeError
-
-    def __setstate__(self, dict):
-        raise TypeError
-
-    def add(self, k, v):
-        (k, v) = (str(k), str(v))
-        (klen, vlen) = (len(k), len(v))
-        self._fp.seek(self._pos)
-        self._fp.write(pack('<II', klen, vlen))
-        self._fp.write(k)
-        self._fp.write(v)
-        h = cdbhash(k)
-        b = self._bucket[h % 256]
-        b.append(h)
-        b.append(self._pos)
-        # sizeof(keylen)+sizeof(datalen)+sizeof(key)+sizeof(data)
-        self._pos += 8 + klen + vlen
-        self.numentries += 1
-        return self
-
-    def finish(self):
-        self._fp.seek(self._pos)
-        pos_hash = self._pos
-        # write hashes
-        for b1 in self._bucket:
-            if not b1: continue
-            blen = len(b1)
-            a = array('I', [0] * blen * 2)
-            for j in xrange(0, blen, 2):
-                (h, p) = (b1[j], b1[j+1])
-                i = ((h >> 8) % blen) * 2
-                while a[i + 1]:
-                    i = (i + 2) % len(a)
-                a[i] = h
-                a[i + 1] = p
-            self._fp.write(encode(a))
-        # write header
-        self._fp.seek(0)
-        a = array('I')
-        for b1 in self._bucket:
-            a.append(pos_hash)
-            a.append(len(b1))
-            pos_hash += len(b1) * 8
-        self._fp.write(encode(a))
-        self.close()
-        os.rename(self.fntmp, self.fn)
-
-cdbmake = CDBMaker
-init = CDBReader
--- a/contrib/xml/preloaded_items.xml	Sun Sep 25 18:25:26 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<backend><item name="Home"><meta></meta>
-<revision revno="0"><meta><entry key="contenttype"><str>text/x.moin.wiki;charset=utf-8</str>
-</entry>
-<entry key="sha1"><str>71b13de8c73fe3c3b9dd1cac8848dd1ad2f5d1be</str>
-</entry>
-<entry key="name"><str>Home</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="itemlinks"><list><str>rst</str>
-<str>moin</str>
-<str>creole</str>
-<str>docbook</str>
-</list>
-</entry>
-<entry key="hostname"><str>localhost</str>
-</entry>
-<entry key="uuid"><str>Home</str>
-</entry>
-<entry key="mtime"><int>1299968390</int>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="address"><str>127.0.0.1</str>
-</entry>
-<entry key="size"><int>242</int>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBtb2luMiB0ZXN0IGNvbnRlbnQgPQ0KDQpUaGUgcHJlbG9hZGVkX2l0ZW1zLnhtbCBjdXJyZW50bHkgb25seSBoYXMgbWluaW1hbCBjb250ZW50IGZvciB0ZXN0aW5nOg0KICogW1ttb2lufE1vaW4gV2lraSBtYXJrdXAgaXRlbV1dDQogKiBbW2NyZW9sZXxDcmVvbGUgV2lraSBtYXJrdXAgaXRlbV1dDQogKiBbW3JzdHxyZVNUIG1hcmt1cCBpdGVtXV0=</chunk>
-<chunk>DQogKiBbW2RvY2Jvb2t8RG9jQm9vayBYTUwgbWFya3VwIGl0ZW1dXQ0K</chunk>
-</data>
-</revision>
-</item>
-<item name="rst"><meta></meta>
-<revision revno="0"><meta><entry key="contenttype"><str>text/x-rst;charset=utf-8</str>
-</entry>
-<entry key="sha1"><str>f4785f356c041ddfd1e1efbafc73b32141805a50</str>
-</entry>
-<entry key="name"><str>rst</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="itemlinks"><list></list>
-</entry>
-<entry key="hostname"><str>localhost</str>
-</entry>
-<entry key="uuid"><str>rst</str>
-</entry>
-<entry key="mtime"><int>1299968391</int>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="address"><str>127.0.0.1</str>
-</entry>
-<entry key="size"><int>216</int>
-</entry>
-</meta>
-<data coding="base64"><chunk>QSBSZVN0cnVjdHVyZWRUZXh0IERvY3VtZW50DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KV2UgbmVlZCBhICoqYmV0dGVyKiogZGVtbyBkb2N1bWVudCBoZXJlLCB0aGF0Og0KDQotIGRlbW9uc3RyYXRlcyB0aGUgbW9zdCBpbXBvcnRhbnQgZWxlbWVudHMgb2YgcmVTVA0KLSBkb2Vzbid0IGNyYXNoIChsaWtlIHRoZSByc3QgcHJpbWVyIGM=</chunk>
-<chunk>dXJyZW50bHkgZG9lcykNCg==</chunk>
-</data>
-</revision>
-</item>
-<item name="moin"><meta></meta>
-<revision revno="0"><meta><entry key="contenttype"><str>text/x.moin.wiki;charset=utf-8</str>
-</entry>
-<entry key="sha1"><str>7042df8e761faffbbf1f08a87c1404f75f7b3e64</str>
-</entry>
-<entry key="name"><str>moin</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="itemlinks"><list><str>SiblingItem</str>
-<str>Item</str>
-<str>moin/SubItem</str>
-<str>MeatBall:InterWiki</str>
-<str>Item/SubItem</str>
-</list>
-</entry>
-<entry key="hostname"><str>localhost</str>
-</entry>
-<entry key="uuid"><str>moin</str>
-</entry>
-<entry key="mtime"><int>1299968391</int>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="address"><str>127.0.0.1</str>
-</entry>
-<entry key="size"><int>4218</int>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBNb2luIFdpa2kgU3ludGF4ID0NCg0KPT0gSGVhZGluZ3MgPT0NCg0KPT09IGhlYWRpbmcgM3JkIGxldmVsID09PQ0KPT09PSBoZWFkaW5nIDR0aCBsZXZlbCA9PT09DQo9PT09PSBoZWFkaW5nIDV0aCBsZXZlbCA9PT09PQ0KPT09PT09IG5vIGhlYWRpbmcgNnRoIGxldmVsID09PT09PQ0KDQo9PSBUZXh0IEZvcm1hdHRpbmcgPT0NCg0KfHw8cm93Ymc=</chunk>
-<chunk>Y29sb3I9IiNmZmZmY2MiIHdpZHRoPSI1MCUiPiAnJydNYXJrdXAnJycgfHwgJycnUmVzdWx0JycnICAgfHwNCnx8ICBgJydpdGFsaWMnJ2AgICAgIHx8ICcnaXRhbGljJycgICAgICAgfHwNCnx8ICBgJycnYm9sZCcnJ2AgICAgIHx8ICcnJ2JvbGQnJycgICAgICAgfHwNCnx8ICBgX191bmRlcmxpbmVfX2AgIHx8IF9fdW5kZXJsaW5lX18gICB8fA0KfHw=</chunk>
-<chunk>ICBgXnN1cGVyXnNjcmlwdGAgIHx8IF5zdXBlcl5zY3JpcHQgICAgfHwNCnx8ICBgLCxzdWIsLHNjcmlwdGAgIHx8ICwsc3ViLCxzY3JpcHQgICAgfHwNCnx8ICBgfi1zbWFsbGVyLX5gICAgIHx8IH4tc21hbGxlci1+ICAgICB8fA0KfHwgIGB+K2xhcmdlcit+YCAgICAgfHwgfitsYXJnZXIrfiAgICAgICB8fA0KfHwgYC0tKHN0cm9rZSktLWAgICAgfHw=</chunk>
-<chunk>IC0tKHN0cm9rZSktLSAgICAgfHwNCg0KDQo9PT0gSW50ZXJuYWwgTGlua3MgPT09DQoNCnx8PHJvd2JnY29sb3I9IiNmZmZmY2MiIHdpZHRoPSI1MCUiPiAnJydNYXJrdXAnJycgfHwgJycnUmVzdWx0JycnIHx8DQp8fCBgW1tJdGVtXV1gIHx8IFtbSXRlbV1dIHx8DQp8fCBgW1tJdGVtL1N1Ykl0ZW1dXWAgfHwgW1tJdGVtL1N1Ykl0ZW1dXSB8fA0KfHw=</chunk>
-<chunk>IGBbWy9TdWJJdGVtXV1gIHx8IFtbL1N1Ykl0ZW1dXSB8fA0KfHwgYFtbLi4vU2libGluZ0l0ZW1dXWAgfHwgW1suLi9TaWJsaW5nSXRlbV1dIHx8DQp8fCBgW1tJdGVtfG5hbWVkIGxpbmtdXWAgfHwgW1tJdGVtfG5hbWVkIGxpbmtdXSB8fA0KfHwgYFtbI2FuY2hvcm5hbWVdXWAgfHwgW1sjYW5jaG9ybmFtZV1dIHx8DQp8fCBgW1sjYW5jaG9ybmFtZXw=</chunk>
-<chunk>ZGVzY3JpcHRpb25dXWAgfHwgW1sjYW5jaG9ybmFtZXxkZXNjcmlwdGlvbl1dIHx8DQp8fCBgW1tJdGVtI2FuY2hvcm5hbWVdXWAgfHwgW1tJdGVtI2FuY2hvcm5hbWVdXSB8fA0KfHwgYFtbSXRlbSNhbmNob3JuYW1lfGRlc2NyaXB0aW9uXV1gIHx8IFtbSXRlbSNhbmNob3JuYW1lfGRlc2NyaXB0aW9uXV0gfHwNCg0KDQo9PT0gRXh0ZXJuYWwgTGlua3M=</chunk>
-<chunk>ID09PQ0KDQp8fDxyb3diZ2NvbG9yPSIjZmZmZmNjIiB3aWR0aD0iNTAlIj4gJycnTWFya3VwJycnIHx8ICcnJ1Jlc3VsdCcnJyB8fA0KfHwgYFtbaHR0cDovL21vaW5tby5pbi9dXWAgfHwgW1todHRwOi8vbW9pbm1vLmluL11dIHx8DQp8fCBgW1todHRwOi8vbW9pbm1vLmluL3xNb2luTW9pbiBXaWtpXV1gIHx8IFtbaHR0cDovL21vaW5tby5pbi98TW8=</chunk>
-<chunk>aW5Nb2luIFdpa2ldXSB8fA0KfHwgYFtbaHR0cDovL3N0YXRpYy5tb2lubW8uaW4vbG9nb3MvbW9pbm1vaW4ucG5nXV1gIHx8IFtbaHR0cDovL3N0YXRpYy5tb2lubW8uaW4vbG9nb3MvbW9pbm1vaW4ucG5nXV0gfHwNCnx8IGB7e2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ319YCB8fCB7e2h0dHA6Ly9zdGF0aWMubW9pbm0=</chunk>
-<chunk>by5pbi9sb2dvcy9tb2lubW9pbi5wbmd9fSB8fA0KfHwgYFtbaHR0cDovL3N0YXRpYy5tb2lubW8uaW4vbG9nb3MvbW9pbm1vaW4ucG5nfG1vaW5tb2luLnBuZ11dYCB8fCBbW2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ3xtb2lubW9pbi5wbmddXSB8fA0KfHwgYFtbTWVhdEJhbGw6SW50ZXJXaWtpXV1gIHx8IFtbTWVhdEI=</chunk>
-<chunk>YWxsOkludGVyV2lraV1dIHx8DQp8fCBgW01lYXRCYWxsOkludGVyV2lraXxJbnRlcldpa2kgcGFnZSBvbiBNZWF0QmFsbF1dYCB8fCBbW01lYXRCYWxsOkludGVyV2lraXxJbnRlcldpa2kgcGFnZSBvbiBNZWF0QmFsbF1dIHx8DQp8fCBgW1tmaWxlOi8vLy8vc2VydmVyL3NoYXJlL2ZpbGVuYW1lJTIwd2l0aCUyMHNwYWNlcy50eHR8bGluayB0byBmaWw=</chunk>
-<chunk>ZW5hbWUudHh0XV1gIHx8IFtbZmlsZTovLy8vL3NlcnZlci9zaGFyZS9maWxlbmFtZSUyMHdpdGglMjBzcGFjZXMudHh0fGxpbmsgdG8gZmlsZW5hbWUudHh0XV0gfHwNCg0KDQo9PSBCbG9ja3F1b3RlcyBhbmQgSW5kZW50YXRpb25zID09DQogaW5kZW50ZWQgdGV4dA0KICB0ZXh0IGluZGVudGVkIHRvIHRoZSAybmQgbGV2ZWwNCg0KPT0gTGlzdHMgPT0=</chunk>
-<chunk>DQo9PT0gVW5vcmRlcmVkIExpc3RzID09PQ0KICogaXRlbSAxDQoNCiAqIGl0ZW0gMiAocHJlY2VkaW5nIHdoaXRlIHNwYWNlKQ0KICAqIGl0ZW0gMi4xDQogICAqIGl0ZW0gMi4xLjENCiAqIGl0ZW0gMw0KICAuIGl0ZW0gMy4xIChidWxsZXRsZXNzKQ0KIC4gaXRlbSA0IChidWxsZXRsZXNzKQ0KICAqIGl0ZW0gNC4xDQogICAuIGl0ZW0gNC4xLjEgKGI=</chunk>
-<chunk>dWxsZXRsZXNzKQ0KDQo9PT0gT3JkZXJlZCBMaXN0cyA9PT0NCj09PT0gd2l0aCBOdW1iZXJzID09PT0NCiAxLiBpdGVtIDENCiAgIDEuIGl0ZW0gMS4xDQogICAxLiBpdGVtIDEuMg0KIDEuIGl0ZW0gMg0KDQo9PT09IHdpdGggUm9tYW4gTnVtYmVycyA9PT09DQogSS4gaXRlbSAxDQogICBpLiBpdGVtIDEuMQ0KICAgaS4gaXRlbSAxLjINCiBJLiBpdGU=</chunk>
-<chunk>bSAyDQoNCj09PT0gd2l0aCBMZXR0ZXJzID09PT0NCiBBLiBpdGVtIEENCiAgIGEuIGl0ZW0gQS4gYSkNCiAgIGEuIGl0ZW0gQS4gYikNCiBBLiBpdGVtIEINCg0KPT09IERlZmluaXRpb24gTGlzdHMgPT09DQogdGVybTo6IGRlZmluaXRpb24NCiBvYmplY3Q6Og0KIDo6IGRlc2NyaXB0aW9uIDENCiA6OiBkZXNjcmlwdGlvbiAyDQoNCj09IEhvcml6b24=</chunk>
-<chunk>dGFsIFJ1bGVzID09DQotLS0tDQotLS0tLQ0KLS0tLS0tDQoNCj09IFRhYmxlcyA9PQ0KfHwnJydBJycnfHwnJydCJycnfHwnJydDJycnfHwNCnx8MSAgICAgIHx8MiAgICAgIHx8MyAgICAgIHx8DQoNCj09PSBDZWxsIFdpZHRoID09PQ0KDQp8fG1pbmltYWwgd2lkdGggfHw8OTklPm1heGltYWwgd2lkdGggfHwNCg0KPT09IFNwYW5uaW5nIFJvd3MgYW4=</chunk>
-<chunk>ZCBDb2x1bW5zICA9PT0NCnx8PHwyPiBjZWxsIHNwYW5uaW5nIDIgcm93cyB8fGNlbGwgaW4gdGhlIDJuZCBjb2x1bW4gfHwNCnx8Y2VsbCBpbiB0aGUgMm5kIGNvbHVtbiBvZiB0aGUgMm5kIHJvdyB8fA0KfHw8LTI+IGNlbGwgc3Bhbm5pbmcgMiBjb2x1bW5zIHx8DQp8fHx8dXNlIGVtcHR5IGNlbGxzIGFzIGEgc2hvcnRoYW5kIHx8DQoNCj09PSBBbGk=</chunk>
-<chunk>Z25tZW50IG9mIENlbGwgQ29udGVudHMgPT09DQoNCnx8PF58Mz4gdG9wIChjb21iaW5lZCkgfHw8Ojk5JT4gY2VudGVyIChjb21iaW5lZCkgfHw8dnwzPiBib3R0b20gKGNvbWJpbmVkKSB8fA0KfHw8KT4gcmlnaHQgfHwNCnx8PCg+IGxlZnQgfHwNCg0KPT09IENvbG91cmVkIFRhYmxlIENlbGxzID09PQ0KDQp8fDwjMDAwMEZGPiBibHVlIHx8PCMwMEY=</chunk>
-<chunk>RjAwPiBncmVlbiAgICB8fDwjRkYwMDAwPiByZWQgICAgfHwNCnx8PCMwMEZGRkY+IGN5YW4gfHw8I0ZGMDBGRj4gbWFnZW50YSAgfHw8I0ZGRkYwMD4geWVsbG93IHx8DQoNCj09PSBIVE1MLWxpa2UgT3B0aW9ucyBmb3IgVGFibGVzID09PQ0KDQp8fEEgfHw8cm93c3Bhbj0iMiI+IGxpa2UgPHwyPiB8fA0KfHw8Ymdjb2xvcj0iIzAwRkYwMCI+IGxpa2U=</chunk>
-<chunk>IDwjMDBGRjAwPiB8fA0KfHw8Y29sc3Bhbj0iMiI+IGxpa2UgPC0yPnx8DQoNCj09IFNtaWxleXMgYW5kIEljb25zID09DQoNCjotKSA7LSkgLyFcICghKQ0KDQo9PSBBZG1vbml0aW9ucyA9PQ0KDQp7e3sjIXdpa2kgY2F1dGlvbg0KJycnRG9uJ3Qgb3ZlcnVzZSBhZG1vbml0aW9ucycnJw0KDQpBZG1vbml0aW9ucyBzaG91bGQgYmUgdXNlZCB3aXRoIGM=</chunk>
-<chunk>YXJlLiBBIHBhZ2UgcmlkZGxlZCB3aXRoIGFkbW9uaXRpb25zIHdpbGwgbG9vayByZXN0bGVzcyBhbmQgd2lsbCBiZSBoYXJkZXIgdG8gZm9sbG93IHRoYW4gYSBwYWdlIHdoZXJlIGFkbW9uaXRpb25zIGFyZSB1c2VkIHNwYXJpbmdseS4NCn19fQ0KDQoNCj09IENvbW1lbnRzID09DQoNCnt7eyMhd2lraSBkYXNoZWQNCkNsaWNrIG9uICJDb21tZW50cyI=</chunk>
-<chunk>IGluIGVkaXQgYmFyIHRvIHRvZ2dsZSB0aGUgLyogY29tbWVudHMgKi8gdmlzaWJpbGl0eS4NCn19fQ0KDQp7e3sjIXdpa2kgY29tbWVudC9kYXNoZWQNClRoaXMgaXMgYSB3aWtpIHBhcnNlciBzZWN0aW9uIHdpdGggY2xhc3MgImNvbW1lbnQgZGFzaGVkIiAoc2VlIEhlbHBPblBhcnNlcnMpLg0KDQpJdHMgdmlzaWJpbGl0eSBnZXRzIHRvZ2dsZWQgdGg=</chunk>
-<chunk>ZSBzYW1lIHdheS4NCn19fQ0K</chunk>
-</data>
-</revision>
-</item>
-<item name="creole"><meta></meta>
-<revision revno="0"><meta><entry key="contenttype"><str>text/x.moin.creole;charset=utf-8</str>
-</entry>
-<entry key="sha1"><str>342b4fb55122cd53583639792218c501b9f36488</str>
-</entry>
-<entry key="name"><str>creole</str>
-</entry>
-<entry key="language"><str>en</str>
-</entry>
-<entry key="itemlinks"><list><str>SiblingItem</str>
-<str>MeatBall:InterWiki</str>
-<str>Item/SubItem</str>
-<str>Item</str>
-<str>#anchorname</str>
-<str>Item#anchorname</str>
-<str>creole/SubItem</str>
-</list>
-</entry>
-<entry key="hostname"><str>localhost</str>
-</entry>
-<entry key="uuid"><str>creole</str>
-</entry>
-<entry key="mtime"><int>1299968391</int>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="address"><str>127.0.0.1</str>
-</entry>
-<entry key="size"><int>2167</int>
-</entry>
-</meta>
-<data coding="base64"><chunk>PSBDcmVvbGUgU3ludGF4ID0NCg0KKipDcmVvbGUqKiA8PEZvb3ROb3RlKGh0dHA6Ly93d3cud2lraWNyZW9sZS5vcmcvKT4+IGlzIGEgbmV3IHdpa2kgbWFya3VwIGxhbmd1YWdlIC0gaXRzIGdvYWwgaXMgdG8gYmVjb21lIHRoZSBvbmUgY29tbW9uIHdpa2kgc3ludGF4IGFuZCBlbmFibGUgYmV0dGVyIGV4Y2hhbmdlIG9mIGNvbnRlbnQgYmV0d2VlbiA=</chunk>
-<chunk>ZGlmZmVyZW50IHdpa2kgZW5naW5lcy4NCg0KVGhpcyBwYWdlIGludHJvZHVjZXMgeW91IHRvIHRoZSBtb3N0IGltcG9ydGFudCBlbGVtZW50cyBvZiB0aGUgY3Jlb2xlIHN5bnRheCwgc2hvd2luZyBmaXJzdCB0aGUgbWFya3VwIHZlcmJhdGltIGFuZCB0aGVuIGhvdyBpdCBpcyByZW5kZXJlZCBieSB0aGUgd2lraSBlbmdpbmUuIFBsZWFzZSBub3RlIHQ=</chunk>
-<chunk>aGF0IHNvbWUgb2YgdGhlIGZlYXR1cmVzIGRlcGVuZCBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uDQoNCiAgLy9CVFc6IFRoaXMgdmVyeSBwYWdlIGlzIHdyaXR0ZW4gaW4gY3Jlb2xlIHN5bnRheCEvLw0KDQo9PSBUYWJsZSBvZiBDb250ZW50cyA9PQ0KKipDb250ZW50cyoqICh1cCB0byB0aGUgMm5kIGxldmVsKQ0KPDxUYWJsZU9mQ29udGVudHMoMik+Pg0=</chunk>
-<chunk>Cg0KDQo9PSBIZWFkaW5ncyA9PQ0KDQo9PT0gaGVhZGluZyAzcmQgbGV2ZWwgPT09DQo9PT09IGhlYWRpbmcgNHRoIGxldmVsID09PT0NCj09PT09IGhlYWRpbmcgNXRoIGxldmVsID09PT09DQoNCj09IFRleHQgRm9ybWF0dGluZyA9PQ0KDQoqIC8vZW1waGFzaXplZCAoaXRhbGljcykvLw0KKiAqKmJvbGRmYWNlKioNCiogKiovL2JvbGQgaXRhbGljcy8=</chunk>
-<chunk>LyoqLCAvLyoqaXRhbGljcyBib2xkKiovLw0KKiB7e3ttb25vc3BhY2V9fX0NCg0KDQo9PSBIeXBlcmxpbmtzID09DQo9PT0gSW50ZXJuYWwgTGlua3MgPT09DQoNCiogW1tJdGVtXV0NCiogW1tJdGVtL1N1Ykl0ZW1dXQ0KKiBbWy9TdWJJdGVtXV0NCiogW1suLi9TaWJsaW5nSXRlbV1dDQoqIFtbSXRlbXxuYW1lZCBsaW5rXV0NCiogW1sjYW5jaG9ybmE=</chunk>
-<chunk>bWVdXQ0KKiBbWyNhbmNob3JuYW1lfGRlc2NyaXB0aW9uXV0NCiogW1tJdGVtI2FuY2hvcm5hbWVdXQ0KKiBbW0l0ZW0jYW5jaG9ybmFtZXxkZXNjcmlwdGlvbl1dDQoNCj09PSBFeHRlcm5hbCBMaW5rcyA9PT0NCg0KKiBodHRwOi8vbW9pbm1vLmluLw0KKiBbW2h0dHA6Ly9tb2lubW8uaW4vXV0NCiogW1todHRwOi8vbW9pbm1vLmluL3xNb2luTW9pbiA=</chunk>
-<chunk>V2lraV1dDQoqIFtbaHR0cDovL3N0YXRpYy5tb2lubW8uaW4vbG9nb3MvbW9pbm1vaW4ucG5nXV0NCioge3todHRwOi8vc3RhdGljLm1vaW5tby5pbi9sb2dvcy9tb2lubW9pbi5wbmd9fQ0KKiBbW2h0dHA6Ly9zdGF0aWMubW9pbm1vLmluL2xvZ29zL21vaW5tb2luLnBuZ3xtb2lubW9pbi5wbmddXQ0KKiBbW01lYXRCYWxsOkludGVyV2lraXxJbnRlclc=</chunk>
-<chunk>aWtpIHBhZ2Ugb24gTWVhdEJhbGxdXQ0KKiBbW2ZpbGU6Ly8vLy9zZXJ2ZXJuYW1lL3NoYXJlL2Z1bGwvcGF0aC90by9maWxlL2ZpbGVuYW1lJTIwd2l0aCUyMHNwYWNlcy50eHR8bGluayB0byBmaWxlIGZpbGVuYW1lIHdpdGggc3BhY2VzLnR4dF1dDQoNCg0KPT09IEF2b2lkIG9yIExpbWl0IEF1dG9tYXRpYyBMaW5raW5nID09PQ0KICoge3t7aHR0cDo=</chunk>
-<chunk>Ly93d3cuZXhhbXBsZS5jb219fX0NCiAqIH5odHRwOi8vd3d3LmV4YW1wbGUuY29tLw0KDQoNCj09IExpc3RzID09DQo9PT0gVW5vcmRlcmVkIExpc3RzID09PQ0KDQoqIGl0ZW0gMQ0KDQoqIGl0ZW0gMiAocHJlY2VkaW5nIHdoaXRlIHNwYWNlKQ0KKiogaXRlbSAyLjENCioqKiBpdGVtIDIuMS4xDQoqIGl0ZW0gMw0KDQo9PT0gT3JkZXJlZCBMaXN0cyA=</chunk>
-<chunk>PT09DQoNCiMgaXRlbSAxDQojIyBpdGVtIDEuMQ0KIyMgaXRlbSAxLjINCiMgaXRlbSAyDQoNCg0KPT0gSG9yaXpvbnRhbCBSdWxlID09DQoNCi0tLS0NCg0KDQo9PSBUYWJsZXMgPT0NCnt7ew0KfD1BIHw9QiB8PUMgfA0KfCAxIHwgMiB8IDMgfA0KfX19DQp8PUEgfD1CIHw9QyB8DQp8IDEgfCAyIHwgMyB8DQoNCj09IExpbmVicmVhayA9PQ0Ke3t7DQo=</chunk>
-<chunk>Zm9yY2VkXFxsaW5lYnJlYWsNCn19fQ0KZm9yY2VkXFxsaW5lYnJlYWsNCg0KLS0tLQ0KU2VlIGFsc28gW1todHRwOi8vd3d3Lndpa2ljcmVvbGUub3JnL2F0dGFjaC9DaGVhdFNoZWV0L2NyZW9sZV9jaGVhdF9zaGVldC5wbmd8Q3Jlb2xlQ2hlYXRDaGVldF1dIChQTkcgaW1hZ2UpDQotLS0tDQo=</chunk>
-</data>
-</revision>
-</item>
-<item name="docbook"><meta></meta>
-<revision revno="0"><meta><entry key="contenttype"><str>application/docbook+xml;charset=utf-8</str>
-</entry>
-<entry key="sha1"><str>20187313253eb0ffc0a608fcc73999da61147826</str>
-</entry>
-<entry key="name"><str>docbook</str>
-</entry>
-<entry key="hostname"><str>localhost</str>
-</entry>
-<entry key="uuid"><str>docbook</str>
-</entry>
-<entry key="mtime"><int>1299968392</int>
-</entry>
-<entry key="action"><str>SAVE</str>
-</entry>
-<entry key="address"><str>127.0.0.1</str>
-</entry>
-<entry key="size"><int>3082</int>
-</entry>
-</meta>
-<data coding="base64"><chunk>PGFydGljbGUgeG1sbnM9J2h0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc+DQogIDxhcnRpY2xlaW5mbz4NCiAgICA8dGl0bGU+QSBkb2Nib29rIGRvY3VtZW50PC90aXRsZT4NCiAgPC9hcnRpY2xlaW5mbz4NCg0KPHNpbXBhcmE+DQpUaGlzIHBhZ2Ugc2hvd3MgdGhlIGQ=</chunk>
-<chunk>aWZmZXJlbnQgZmVhdHVyZXMgb2Ygb3VyIG5hdGl2ZSBEb2NCb29rIHN1cHBvcnQuDQo8L3NpbXBhcmE+DQoNCjxzZWN0aW9uPg0KPHRpdGxlPkxpc3RzPC90aXRsZT4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+SXRlbWl6ZWQgTGlzdDwvdGl0bGU+DQo8aXRlbWl6ZWRsaXN0Pg0KICA8bGlzdGl0ZW0+DQogICAgPHBhcmE+SXRlbSAxDQogICAgPC9wYXJhPg0=</chunk>
-<chunk>CiAgPC9saXN0aXRlbT4NCiAgPGxpc3RpdGVtPg0KICAgIDxwYXJhPkl0ZW0gMg0KICAgIDwvcGFyYT4NCiAgPC9saXN0aXRlbT4NCiAgPGxpc3RpdGVtPg0KICAgIDxwYXJhPiBJdGVtIDMNCiAgICA8L3BhcmE+DQogIDwvbGlzdGl0ZW0+DQo8L2l0ZW1pemVkbGlzdD4NCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+T3JkZXJlZCBMaXN0PC8=</chunk>
-<chunk>dGl0bGU+DQo8b3JkZXJlZGxpc3QgbnVtZXJhdGlvbj0ibG93ZXJyb21hbiI+DQogIDxsaXN0aXRlbT4NCiAgICA8cGFyYT5PbmU8L3BhcmE+DQogIDwvbGlzdGl0ZW0+DQogIDxsaXN0aXRlbT4NCiAgICA8cGFyYT5Ud288L3BhcmE+DQogIDwvbGlzdGl0ZW0+DQogIDxsaXN0aXRlbT4NCiAgICA8cGFyYT5UaHJlZTwvcGFyYT4NCiAgPC9saXN0aXRlbT4=</chunk>
-<chunk>DQogIDxsaXN0aXRlbT4NCiAgICA8cGFyYT5Gb3VyPC9wYXJhPg0KICA8L2xpc3RpdGVtPg0KPC9vcmRlcmVkbGlzdD4NCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+VmFyaWFibGUgTGlzdDwvdGl0bGU+DQo8dmFyaWFibGVsaXN0Pjx0aXRsZT5Gb250IEZpbGVuYW1lIEV4dGVuc2lvbnM8L3RpdGxlPg0KICA8dmFybGlzdGVudHJ5Pg0KICA=</chunk>
-<chunk>ICA8dGVybT48ZmlsZW5hbWU+VFRGPC9maWxlbmFtZT48L3Rlcm0+DQogICAgPGxpc3RpdGVtPg0KICAgICAgPHBhcmE+VHJ1ZVR5cGUgZm9udHMuPC9wYXJhPg0KICAgIDwvbGlzdGl0ZW0+DQogIDwvdmFybGlzdGVudHJ5Pg0KICA8dmFybGlzdGVudHJ5Pg0KICAgIDx0ZXJtPjxmaWxlbmFtZT5QRkE8L2ZpbGVuYW1lPjwvdGVybT4NCiAgICA8dGVybT4=</chunk>
-<chunk>PGZpbGVuYW1lPlBGQjwvZmlsZW5hbWU+PC90ZXJtPg0KICAgIDxsaXN0aXRlbT4NCiAgICAgIDxwYXJhPg0KICAgICAgICBQb3N0U2NyaXB0IGZvbnRzLiA8ZmlsZW5hbWU+UEZBPC9maWxlbmFtZT4gZmlsZXMgYXJlIGNvbW1vbg0KICAgICAgICBvbiA8YWNyb255bT5VTklYPC9hY3JvbnltPiBzeXN0ZW1zLCA8ZmlsZW5hbWU+UEZCPC9maWxlbmFtZT4=</chunk>
-<chunk>DQogICAgICAgIGZpbGVzIGFyZSBtb3JlIGNvbW1vbiBvbiBXaW5kb3dzIHN5c3RlbXMuDQogICAgICA8L3BhcmE+DQogICAgPC9saXN0aXRlbT4NCiAgPC92YXJsaXN0ZW50cnk+DQogPC92YXJpYWJsZWxpc3Q+DQo8L3NlY3Rpb24+DQoNCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+TWlzYzwvdGl0bGU+DQo8c2VjdGlvbj4NCjx0aXRsZT4=</chunk>
-<chunk>Rm9vdG5vdGVzPC90aXRsZT4NCjxwYXJhPkFuIGFubnVhbCBwZXJjZW50YWdlIHJhdGUgKDxhYmJyZXY+QVBSPC9hYmJyZXY+KSBvZiAxMy45JTxmb290bm90ZT4NCjxwYXJhPlRoZSBwcmltZSByYXRlLCBhcyBwdWJsaXNoZWQgaW4gdGhlIDxjaXRldGl0bGU+V2FsbCBTdHJlZXQNCkpvdXJuYWw8L2NpdGV0aXRsZT4gb24gdGhlIGZpcnN0IGJ1c2luZXM=</chunk>
-<chunk>cyBkYXkgb2YgdGhlIG1vbnRoLA0KcGx1cyA3LjAlLg0KPC9wYXJhPg0KPC9mb290bm90ZT4NCndpbGwgYmUgY2hhcmdlZCBvbiBhbGwgYmFsYW5jZXMgY2FycmllZCBmb3J3YXJkLg0KPC9wYXJhPg0KPC9zZWN0aW9uPg0KDQo8c2VjdGlvbj4NCjx0aXRsZT5RdW90ZXM8L3RpdGxlPg0KPHBhcmE+VGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCA8cXVvdGU=</chunk>
-<chunk>PmFzIGlzPC9xdW90ZT4sIHdpdGhvdXQgZXhwcmVzc2VkDQpvciBpbXBsaWVkIHdhcnJhbnR5Lg0KPC9wYXJhPg0KPC9zZWN0aW9uPg0KDQo8c2VjdGlvbj4NCjx0aXRsZT5UcmFkZW1hcms8L3RpdGxlPg0KPHBhcmE+PHRyYWRlbWFyayBjbGFzcz0ncmVnaXN0ZXJlZCc+TnV0c2hlbGwgSGFuZGJvb2s8L3RyYWRlbWFyaz4gaXMgYQ0KcmVnaXN0ZXJlZCA=</chunk>
-<chunk>dHJhZGVtYXJrIG9mIE8nUmVpbGx5IE1lZGlhLCBJbmMuDQo8L3BhcmE+DQo8L3NlY3Rpb24+DQo8L3NlY3Rpb24+DQoNCjxzZWN0aW9uPg0KPHRpdGxlPkxpbmtzPC90aXRsZT4NCjxzZWN0aW9uPg0KPHRpdGxlPkRvY2Jvb2sgdjUgbGlua3M8L3RpdGxlPg0KPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL21vaW5tby5pbi8iPk1vaW5Nb2luIHJvY2tzPC8=</chunk>
-<chunk>bGluaz4NCjwvc2VjdGlvbj4NCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+T2JqZWN0czwvdGl0bGU+DQo8c2VjdGlvbj4NCjx0aXRsZT5JbWFnZTwvdGl0bGU+DQo8c2ltcGFyYT4NCkhlcmUgaXMgYSBwaWN0dXJlDQo8L3NpbXBhcmE+DQo8bWVkaWFvYmplY3Q+DQogIDxpbWFnZW9iamVjdD4NCiAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9Iis=</chunk>
-<chunk>Z2V0L0pwZWdJbWFnZSIvPg0KICA8L2ltYWdlb2JqZWN0Pg0KPC9tZWRpYW9iamVjdD4NCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+VmlkZW88L3RpdGxlPg0KPHNpbXBhcmE+DQpIZXJlIGlzIGEgdmlkZW8NCjwvc2ltcGFyYT4NCjxtZWRpYW9iamVjdD4NCiAgPHZpZGVvb2JqZWN0Pg0KICAgIDx2aWRlb2RhdGEgZmlsZXJlZj0iK2dldC8=</chunk>
-<chunk>SHRtbDVWaWRlbyIvPg0KICA8L3ZpZGVvb2JqZWN0Pg0KPC9tZWRpYW9iamVjdD4NCjwvc2VjdGlvbj4NCg0KPHNlY3Rpb24+DQo8dGl0bGU+QXVkaW88L3RpdGxlPg0KPHNpbXBhcmE+DQpIZXJlIGlzIGEgc291bmQNCjwvc2ltcGFyYT4NCjxtZWRpYW9iamVjdD4NCiAgPGF1ZGlvb2JqZWN0Pg0KICAgIDxhdWRpb2RhdGEgZmlsZXJlZj0iK2dldC9IdG0=</chunk>
-<chunk>bDVBdWRpbyIvPg0KICA8L2F1ZGlvb2JqZWN0Pg0KPC9tZWRpYW9iamVjdD4NCjwvc2VjdGlvbj4NCjwvc2VjdGlvbj4NCg0KPC9hcnRpY2xlPg==</chunk>
-</data>
-</revision>
-</item>
-</backend>
--- a/docs/admin/backup.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/admin/backup.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -38,21 +38,22 @@
 To create a dump of all data stored in moin (wiki items, user profiles), do
 this::
 
- moin maint_xml --save --file backup.xml
+ moin save --file backup.moin
 
-Please note that backup.xml contains sensitive data (like user profiles, wiki
-contents). Wiki item revision data is stored encoded, but it is **not**
-encrypted, so store your backups at a safe place and make sure no unauthorized
+Please note that this file contains sensitive data (like user profiles, wiki
+contents), so store your backups at a safe place and make sure no unauthorized
 persons can access them.
 
 Selective Restore
 =================
 
 Restore all software and configuration files (see above) to their original
-place. Make sure your (empty) wiki works as expected and the moin version is
-the same as when you made the backup.
+place. Make sure your (empty) wiki works as expected::
 
-To load the xml dump into your empty wiki, do this::
+ moin moin -s -i  # -s = create new storage
+                  # -i = create new index
 
- moin maint_xml --load --file backup.xml
+To load the backup file into your empty wiki, do this::
 
+ moin load --file backup.moin
+
--- a/docs/admin/configure.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/admin/configure.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -1008,7 +1008,6 @@
   parts of the namespace:
 
   - content
-  - trash
   - userprofiles
 * to configure ACLs protecting these parts of the namespace
 * to setup a router middleware that dispatches to these parts of the namespace
@@ -1016,10 +1015,10 @@
 
 Call it like::
 
-    from MoinMoin.storage.backends import create_simple_mapping
+    from MoinMoin.storage import create_simple_mapping
 
-    namespace_mapping = create_simple_mapping(
-        backend_uri=...,
+    namespace_mapping, acl_mapping = create_simple_mapping(
+        uri=...,
         content_acl=dict(before=...,
                          default=...,
                          after=...,
@@ -1029,14 +1028,18 @@
                               after=..., ),
     )
 
-The `backend_uri` depends on the kind of storage backend you want to use (see
-below). Usually it is a URL-like string that looks like::
+The `uri` depends on the kind of storage backend and stores you want to use
+(see below). Usually it is a URL-like string that looks like::
 
-    fs2:/srv/mywiki/%(nsname)s
+    stores:fs:/srv/mywiki/%(nsname)s/%%(kind)s
     
-`fs2` is the name of the backend, followed by a colon, followed by a backend
-specific part that may include a `%(nsname)s` placeholder which gets replaced
-by 'content', 'trash' or 'userprofiles' for the respective backend.
+`stores` is the name of the backend, followed by a colon, followed by a store
+specification. `fs` is the name of the store, followed by a specification
+that makes sense for the fs (filesystem) store (== a path with placeholders).
+
+`%(nsname)s` placeholder will be replaced 'content' or 'userprofiles' for
+the respective backend. `%%(kind)s` will be replaced by 'meta' or 'data'
+later.
 
 In this case, the mapping created will look like this:
 
@@ -1045,25 +1048,24 @@
 +----------------+-----------------------------+
 | /              | /srv/mywiki/content/        |
 +----------------+-----------------------------+
-| /Trash/        | /srv/mywiki/trash/          |
-+----------------+-----------------------------+
 | /UserProfiles/ | /srv/mywiki/userprofiles/   |
 +----------------+-----------------------------+
 
-`content_acl` is a dictionary specifying the ACLs for this part of the
-namespace (the normal content). See the docs about ACLs.
+`content_acl` and `user_profile_acl` are dictionaries specifying the ACLs for
+this part of the namespace (normal content, user profiles).
+See the docs about ACLs.
 
-acl middleware
---------------
+protecting middleware
+---------------------
 Features:
 
-* protects access to lower storage layers by Access Control Lists
+* protects access to lower storage layers by ACLs (Access Control Lists)
 * makes sure there won't be ACL security issues, even if upper layers have bugs
 * if you use create_simple_mapping, you just give the ACL parameters, the
   middleware will be set up automatically by moin.
 
-router middleware
------------------
+routing middleware
+------------------
 Features:
 
 * dispatches storage access to different backends depending on the item name
@@ -1071,34 +1073,34 @@
 * if you use create_simple_mapping, the router middleware will be set up
   automatically by moin.
 
-indexing mixin
---------------
+indexing middleware
+-------------------
 Features:
 
 * maintains an index for important metadata values
 * speeds up looking up / selecting items
 * makes it possible that lower storage layers can be simpler
-* if you use create_simple_mapping, the indexing will be set up automatically
-  by moin.
+* the indexing middleware will be set up automatically by moin.
 
-fs2 backend
------------
+stores backend
+--------------
+This is a backend that ties together 2 stores (one for meta, one for data) to
+form a backend.
+
+fs store
+--------
 Features:
 
 * stores into the filesystem
 * store metadata and data into separate files/directories
-* uses content-hash addressing for revision data files
-
-  - this automatically de-duplicates revision data with same content within the
-    whole backend!
 
 Configuration::
 
-    from MoinMoin.storage.backends import create_simple_mapping
+    from MoinMoin.storage import create_simple_mapping
 
     data_dir = '/srv/mywiki/data'
-    namespace_mapping = create_simple_mapping(
-        backend_uri='fs2:%s/%%(nsname)s' % data_dir,
+    namespace_mapping, acl_mapping = create_simple_mapping(
+        uri='stores:fs:%s/%%(nsname)s/%%%%(kind)s' % data_dir,
         content_acl=dict(before=u'WikiAdmin:read,write,create,destroy',
                          default=u'All:read,write,create',
                          after=u'', ),
@@ -1108,33 +1110,12 @@
     )
 
 
-fs backend
+sqla store
 ----------
 Features:
 
-* stores into the filesystem
-* stores meta and data of a revision into single file
-
-`backend_uri` for `create_simple_mapping` looks like::
-
-    fs:/srv/mywiki/data/%(nsname)s
-
-hg backend
-----------
-Features:
-
-* stores data into Mercurial DVCS (hg) - you need to have Mercurial installed
-
-`backend_uri` for `create_simple_mapping` looks like::
-
-    hg:/srv/mywiki/data/%(nsname)s
-
-sqla backend
-------------
-Features:
-
-* stores data into a (SQL) database
-* uses slqalchemy ORM as database abstraction
+* stores data into a (SQL) database / table
+* uses slqalchemy (without ORM) as database abstraction
 * supports multiple types of databases, like:
  
   - sqlite (default, comes built-into Python)
@@ -1142,24 +1123,57 @@
   - mysql
   - and others (see sqlalchemy docs).
 
-`backend_uri` for `create_simple_mapping` looks like e.g.::
+`uri` for `create_simple_mapping` looks like e.g.::
 
-    sqla:sqlite:////srv/mywiki/data/mywiki_%(nsname)s.db
-    sqla:mysql://myuser:mypassword@localhost/mywiki_%(nsname)s
-    sqla:postgres://myuser:mypassword@localhost/mywiki_%(nsname)s
+    stores:sqla:sqlite:////srv/mywiki/data/mywiki_%(nsname)s.db
+    stores:sqla:mysql://myuser:mypassword@localhost/mywiki_%(nsname)s
+    stores:sqla:postgres://myuser:mypassword@localhost/mywiki_%(nsname)s
 
 Please see the sqlalchemy docs about the part after `sqla:`.
 
-In case you use some DBMS (like postgresql or mysql) that does not allow
-creation of new databases on an as-needed basis, you need to create the
-databases 'mywiki_content', 'mywiki_trash', 'mywiki_userprofiles' yourself
-manually.
-
 Grant 'myuser' (his password: 'mypassword') full access to these databases.
 
-.. todo::
 
-   The sqla backend needs more love, more tuning.
+kc store
+--------
+Features:
+
+* uses a Kyoto Cabinet file to store
+* very fast
+* single-process only, local only
+
+.. todo:
+
+   add kc store configuration example
+
+
+kt store
+--------
+Features:
+
+* uses a Kyoto Tycoon server to store
+* fast
+* multi-process, local or remote.
+
+.. todo:
+
+   add kt store configuration example
+
+
+memory store
+--------------
+Features:
+
+* keeps everything in RAM
+* definitely not for production use
+* mostly intended for testing
+* if your system or the moin process crashes, you'll lose everything
+* single process only
+
+.. todo:
+
+   add memory store configuration example
+
 
 fileserver backend
 ------------------
@@ -1174,41 +1188,6 @@
   + directories will show up as index items, listing links to their contents
 * might be useful together with SMBMount pseudo-authenticator
 
-flatfile backend
-----------------
-Features:
-
-* uses flat files for item storage
-* no revisioning
-* no separate metadata, just some stuff at top of the (text) data
-* thus, only suitable for text items
-
-memory backend
---------------
-Features:
-
-* keeps everything in RAM
-* definitely not for production use
-* mostly intended for testing
-* if your system or the moin process crashes, you'll lose everything
-* single process only
-* maybe not threadsafe
-
-fs19 backend
-------------
-Features:
-
-* reads moin 1.9 content and users from the filesystem
-* read-only, only provided for data migration from moin 1.9.x
-* not optimized for speed or resource usage
-
-For more details please see the chapter about upgrading from moin 1.9.
-
-
-.. todo:
-
-   add more backends / more configuration examples
-
 
 Mail configuration
 ==================
--- a/docs/admin/index.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/admin/index.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -4,108 +4,134 @@
 
 General
 =======
-moin strongly relies on indexes that accelerate access to item metadata and data.
+moin strongly relies on indexes that accelerate access to item metadata and
+data and makes it possible to have simple backends, because the index layer
+is doing all the hard and complex work.
+
 Indexes are used internally for many operations like item lookup, history,
 iterating over items, search (also for interactive searches), etc..
 
-So, you need to configure indexing correctly first.
+moin won't be able to start with damaged, inaccessible or non-existing indexes.
+
+So, you need to configure and initialize indexing correctly first.
 
 moin will automatically update the index when items are created, updated, deleted,
-destroyed or renamed (via the storage api of moin):
-* when users change content via the user interface
-* when xml is unserialized to load items into the backend
-
-In case you have items changing without usage of the backend api or in case
-your index gets damaged or lost, you need to manually do an index build -
-or moin won't be able to work correctly.
+destroyed or renamed (via the storage api of moin, indexing layer or above).
 
 Configuration
 =============
-Your wiki config needs ``index_dir`` and ``index_dir_tmp`` to point to different
-directories. They have default values and most likely you don't need to change
-them.
+Your wiki config needs ``index_dir`` to point to a writable directory - a fast,
+local filesystem is preferred.
+Use something like::
 
-But if you want, try something like::
+    index_dir = "/path/to/moin-2.0/wiki/index"
 
-      index_dir = "/path/to/moin-2.0/wiki/index"
-      index_dir_tmp = "/path/to/moin-2.0/wiki/tmp_build"
-
-**Note:** Paths MUST BE absolute.
+**Note:**
+* The path MUST be absolute.
+* Moin will use `index_dir`.temp location also, if you build an index at
+the so-called `temporary location`.
 
 
 moin index script reference
 ===========================
-You can use the ``moin index`` script to build, update, clean, move and monitor
-indexes.
-
-MoinMoin uses 2 indexes: ``latest-revs`` (index stores only current revisions)
-and ``all-revs`` (index stores all revisions).
-
-**Note:** If you see <indexname> below, use one of ``latest-revs``, ``all-revs``
-or ``both`` 
-
-Let's see what you can do with that stuff.
-
-Build
------
-Index all revisions of all items to the index located in ``index_dir_tmp`` (we
-use this separate location so that index building does not affect the index
-your wiki engine is currently using).
-
-If there is no index at that location yet, a new index will be built there.
-If there is already an index at that location, that index will be extended.
-
-Example::
-
-    moin index --for <indexname> --action build
-
-**Note:** moin won't use this index until you have moved it to ``index_dir``.
-
-Move
-----
-Move indexes from ``index_dir_tmp`` to ``index_dir``.
+You can use the ``moin index-*`` group of script commands to manage indexes.
 
-Example::
-
-    moin index --for <indexname> --action move
-
-Update
-------
-Update the index located in ``index_dir`` to reflect the current backend
-contents. Add new stuff, remove outdated stuff.
-
-Example::
-
-    moin index --for <indexname> --action update
+Many of the script commands for index management support a `--tmp` option to use
+the temporary index location. This is useful if you want to do index operations
+in parallel to a running wiki which is still using the index at the normal
+index location.
 
-Clean
------
-Create empty index in ``index_dir`` for given index (previous will be erased).
-
-Example::
-
-    moin index --for <indexname> --action clean
+moin index-create
+-----------------
+Creates an empty, but valid index.
 
-Show
-----
-Show contents of the index located in ``index_dir`` in human readable form.
-This is mostly used for debugging.
+**Note:** the moin wsgi application needs an index to successfully start up.
+As the moin index-* script commands are also based on the moin wsgi application,
+this can lead to "which came first, the chicken or the egg?" like problems.
 
-Example::
+To solve this, the moin command has a ``-i`` (``--index-create``) option that
+will trigger index creation on startup.
 
-    moin index --for indexname --action show
+Additionally, if the storage is also non-existant yet, one might also need
+``-s`` (``--storage-create``) to create an empty storage on startup.
 
-**Note:** field length limited to 40 chars.
+moin index-build
+----------------
+Process all revisions of this wiki and add the indexable documents to the index.
 
-**Note:** fields without attribute ``stored=True`` are not displayed.
+**Note:**
+* For big wikis, this can take rather long, consider using --tmp.
+* index-build does NOT clear the index at the beginning.
+* index-build does not check the current contents of the index, you must not run
+  index-build multiple times for the same data / same wiki.
+
+moin index-update
+-----------------
+Compare an index to the current storage contents and update the index as
+needed (add, remove, update stuff) to reflect the current storage contents.
+
+**Note:** You can use this after building at the tmp location, to also get
+the changes that happened to the wiki while building the index. You can run
+index-update multiple times to increasingly catch up.
+
+moin index-destroy
+------------------
+Destroy an index (nothing left at the respective location).
+
+moin index-move
+---------------
+Move the index from the temporary location to the normal location.
+
+moin index-optimize
+-------------------
+Optimize an index, see Whoosh docs for more details.
+
+moin index-dump
+---------------
+Output index contents in human readable form, e.g. for debugging purposes.
+
+**Note:** only fields with attribute ``stored=True`` can be displayed.
 
 
 Building an index for a single wiki
 ===================================
-Build index at separate place, move it at right place:
 
-     moin index --for both --action build
-     moin index --for both --action move
+If your wiki is fresh and empty
+-------------------------------
+Use::
+
+    moin index-create --storage-create --index-create
+    moin index-create -s -i  # same, but shorter
+
+Storage and index is now initialized (both empty).
+
+If you add stuff to your wiki, the index will get updated on the fly.
+
+
+If your wiki has data and is shut down
+--------------------------------------
+If index needs a rebuild for some reason (e.g. index lost, index damaged,
+incompatible upgrade, ...), use::
+
+    moin index-create -i
+    moin index-build  # can take a while...
+
+
+If your wiki has data and should stay online
+--------------------------------------------
+Use::
+
+     moin index-create -i --tmp
+     moin index-build --tmp  # can take a while...
+     moin index-update --tmp  # should be quicker, make sure we have 99.x%
+     # better shut down the wiki now (or at least make sure it is not changed)
+     moin index-update --tmp  # make sure we have indexed ALL content - should be even quicker.
+     moin index-move  # instantaneously
+     # start the wiki again (or allow changes now again)
+
+**Note:** Indexing puts load onto your server, so if you like to do regular
+index rebuilds, schedule them at some time when your server is not too busy
+otherwise.
 
 
 Building an index for a wiki farm
@@ -124,51 +150,21 @@
 
       interwikiname = u"Sales"
       index_dir = "/path/to/wiki/index"
-      index_dir_tmp = "/path/to/wiki/index_tmp"
 
 wiki config for ``Engineering``::
 
       interwikiname = u"Engineering"
       index_dir = "/path/to/wiki/index"
-      index_dir_tmp = "/path/to/wiki/index_tmp"
 
-Now do the initial index building:
+Now do the initial index building::
 
-     moin index --for both --action build # in Sales virtual env
-     moin index --for both --action build # in Engineering virtual env
-     moin index --for both --action move # you can run it from any virtual env
+     moin index-create -i  # create an empty index
+     # now ADD stuff from all your wikis:
+     moin index-build  # with Sales wiki configuration
+     moin index-build  # with Engineering wiki configuration
 
 Now you should have a shared index for all these wikis.
 
 **Note:** Do not build indexes for multiple wikis in parallel, this is not
 supported.
 
-Building indexes while your wiki is running
-===========================================
-If you want to build an index while your wiki is running, you have to be
-careful not to miss any changes that happen while you build the index.
-
-``moin index --action build`` is made to not interfere with your running wiki.
-So you can run this in parallel without taking your wiki offline.
-Depending on the size of your wiki, index build can take rather long - but it
-doesn't matter as you don't have to take your wiki offline for this.
-
-But: if indexing takes rather long, it can easily happen that content that was
-already put into the index is updated afterwards in the online wiki. So we need
-to do a quick index update while the wiki is offline:
-
-Offline your wiki (or at least make it read-only, so no data in it changes).
-
-``moin index --action move`` to move indexes into place.
-
-``moin index --action update`` to add anything we might have missed otherwise.
-As this is not as much as doing a full index build, this should be rather quick
-(but still: it has to look at every item in your wiki, whether it has been
-updated after the initial index build).
-
-Put your wiki back online again.
-
-**Note:** Indexing puts load onto your server, so if you like to do regular
-index rebuilds, schedule them at some time when your server is not too busy
-otherwise.
-
--- a/docs/admin/install.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/admin/install.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -73,17 +73,32 @@
 That way, you can have all sorts of Pythons in different virtualenv directories
 within your moin2 workdir.
 
-Loading some items
-------------------
-In case you do not want to have a completely empty wiki, you may want to load
-some items into it. We provide some in `contrib/xml` directory and you can load
-them like this::
+
+Entering the virtual env
+------------------------
 
  # enter your virtual environment:
  source env/bin/activate
 
+
+Initializing the storage and the index
+--------------------------------------
+
+ moin create-index -s -i
+
+The -s and -i switches make sure moin creates an (empty) storage and an (empty)
+index.
+
+
+Loading some items
+------------------
+In case you do not want to have a completely empty wiki, you may want to load
+some items into it. We provide some in `contrib/serialized` directory and you
+can load them like this::
+
  # load some example items:
- moin maint_xml --load --file=contrib/xml/preloaded_items.xml
+ moin load --file contrib/serialized/preloaded_items.moin
+
 
 Installing PIL
 ~~~~~~~~~~~~~~
--- a/docs/admin/upgrade.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/admin/upgrade.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -51,7 +51,7 @@
 Configuration::
 
     from os.path import join
-    from MoinMoin.storage.backends import create_simple_mapping
+    from MoinMoin.storage import create_simple_mapping
 
     interwikiname = ... # critical, make sure it is same as in 1.9!
     sitename = ... # same as in 1.9
@@ -67,45 +67,20 @@
 
     # think about which backend you will use in the end and configure
     # it here (this is NOT the fs19 backend!):
-    namespace_mapping = \
-        create_simple_mapping(
-            backend_uri='fs2:/some/path/%%(nsname)s',
-            content_acl=dict(before=u'', # acl_rights_before in 1.9
-                             default=u'', # acl_rights_default
-                             after=u'', # acl_rights_after
-                             hierarchic=False), # acl_hierarchic
-            user_profile_acl=dict(before=u'',
-                                  default=u'',
-                                  after=u'',
-                                  hierarchic=False),
-        )
+    # TODO
 
-Exporting your moin 1.9 data to an XML file
--------------------------------------------
-moin2 can use the `fs19` storage backend to access your moin 1.9 content
-(pages, attachments and users). The fs19 backend is a bit more than just
-a backend - it also makes the moin 1.9 data look like moin2 data when
-moin accesses them. To support this, it is essential that you adjust your
-wiki config first, see previous section.
-
-Then, use a **copy** of your 1.9 content, do not point moin2 it at your
-original data::
-
-    moin maint_xml --moin19data=/your/moin19/data --save --file=moin19.xml
 
-This will serialize all your moin 1.9 data into moin19.xml.
-
-Note: depending on the size of your wiki, this can take rather long and consume
-about the same amount of additional disk space.
+Exporting your moin 1.9 data to a file
+--------------------------------------
 
-Importing the XML file into moin2
----------------------------------
-Just load moin19.xml into the storage backend you have already configured::
+TBD
 
-    moin maint_xml --load --file=moin19.xml
 
-Note: depending on the size of your wiki, this can take rather long and consume
-about the same amount of additional disk space.
+Importing the file into moin2
+------------------------------
+
+TBD
+
 
 Testing
 -------
@@ -118,6 +93,7 @@
 If you find issues with data migration from moin 1.9 to 2, please check the
 moin2 issue tracker.
 
+
 Cleanup
 -------
 If you made a **copy** of your 1.9 content, you can remove that copy now.
--- a/docs/devel/development.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/devel/development.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -47,9 +47,7 @@
 * EmeraldTree for xml / tree processing
 * blinker for signalling
 * pygments for syntax highlighting
-* sqlalchemy as sql database abstraction (for indexing)
-
-  - by default using sqlite as database
+* sqlalchemy as sql database abstraction (sqla backend)
 * jquery javascript lib
 * CKeditor - GUI editor for (x)html
 * TWikiDraw, AnyWikiDraw, svgdraw drawing tools
@@ -78,7 +76,7 @@
   - MoinMoin.apps.serve - serving some configurable static 3rd party stuff
 * register before/after request handlers
 * initialize the cache (app.cache)
-* initialize the storage (app.storage)
+* initialize index and storage (app.storage)
 * initialize the translation system
 * initialize theme support
 
@@ -114,22 +112,20 @@
 
 Storage
 -------
-Moin supports different storage backends (like storing directly into files /
-directories, using Mercurial DVCS, using a SQL database, etc. - see
-`MoinMoin.storage.backends`).
-
-All these backends conform to same storage API definition (see
-`MoinMoin.storage`), which is used by the higher levels (no matter what
-backend is used).
+Moin supports different stores (like storing directly into files /
+directories, using key/value stores, using a SQL database, etc. - see
+`MoinMoin.storage.stores`). A store is extremly simple: just store a value
+for a key and retrieve the value using the key + iteration over keys.
 
-There is also some related code in the storage package for:
+A backend is one layer above, dealing with objects that have metadata and
+data, see `MoinMoin.storage.backends`), still very simple stuff.
 
-* processing ACLs (access control lists, protecting that items get accessed
-  by users that are not allowed to)
-* router (a fstab like mechanism, so one can mount multiple backends at
-  different places in the namespace)
-* indexing (putting important metadata into a index database, so finding,
-  selecting items is speedier)
+Above that, there is misc. stuff in `MoinMoin.storage.middleware` for:
+
+* routing by name to some specific backend (like fstab / mount)
+* indexing metadata and data + comfortable and fast index-based access,
+  selection and search
+* protecting stuff by ACLs (access control lists)
 
 DOM based transformations
 -------------------------
--- a/docs/examples/config/wikiconfig.py	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/examples/config/wikiconfig.py	Mon Sep 26 02:38:29 2011 +0200
@@ -1,115 +1,2 @@
-# -*- coding: utf-8 -*-
-# IMPORTANT! This encoding (charset) setting MUST be correct and match the
-# the encoding your editor uses when you modify this file.
-# Otherwise non-ASCII chars will be wrong.
-
-"""
-    MoinMoin - Wiki Configuration
-
-    Note that there are more config options than you'll find in
-    the version of this file that is installed by default; see
-    the module MoinMoin.config.default for a full list of names and their
-    default values (but do not edit THAT module).
-
-    Also, the URL http://moinmo.in/HelpOnConfiguration has
-    a list of config options.
-"""
-
-import os
-
-from MoinMoin.config.default import DefaultConfig
-from MoinMoin.storage.backends import create_simple_mapping
-
-
-class Config(DefaultConfig):
-
-    # Critical setup  ---------------------------------------------------
-
-    # Directory containing THIS wikiconfig:
-    wikiconfig_dir = os.path.abspath(os.path.dirname(__file__))
-
-    # We assume that this config file is located in the instance directory, like:
-    # instance_dir/
-    #              wikiconfig.py
-    #              data/
-    # If that's not true, feel free to just set instance_dir to the real path
-    # where data/
-    #instance_dir = '/where/ever/your/instance/is'
-    instance_dir = wikiconfig_dir
-
-    # Where your own wiki pages are (make regular backups of this directory):
-    data_dir = os.path.join(instance_dir, 'data', '') # path with trailing /
-
-    # This provides a simple default setup for your storage backend configuration.
-    # 'fs:' indicates that you want to use the filesystem backend. You can also use
-    # 'hg:' instead to indicate that you want to use the mercurial backend.
-    # Alternatively you can set up the mapping yourself (see HelpOnStorageConfiguration).
-    #
-    # IMPORTANT: This is also the place to set up your own ACL settings if you don't want
-    #            to use the default (see HelpOnAccessControlLists).
-    namespace_mapping = create_simple_mapping('fs:' + data_dir)
-
-    # Wiki identity ----------------------------------------------------
-
-    # Site name, used by default for wiki name-logo [Unicode]
-    sitename = u'Untitled Wiki'
-
-    # name of entry page / front page [Unicode]
-    #item_root = u"Home"
-
-    # The interwiki name used in interwiki links (set it and never change!)
-    #interwikiname = u'UntitledWiki'
-    # Show the interwiki name (and link it to item_root) in the Theme,
-    # nice for farm setups or when your logo does not show the wiki's name.
-    #show_interwiki = 1
-
-
-    # Security ----------------------------------------------------------
-
-    # The default (ENABLED) password_checker will keep users from choosing too
-    # short or too easy passwords. If you don't like this and your site has
-    # rather low security requirements, feel free to DISABLE the checker by:
-    #password_checker = None # None means "don't do any password strength checks"
-
-
-    # Mail --------------------------------------------------------------
-
-    # Configure mail to enable subscribing to pages or password recovery.
-
-    # SMTP server, e.g. "mail.provider.com" (None to disable mail)
-    #mail_smarthost = ""
-
-    # The return address, e.g u"Jürgen Wiki <noreply@mywiki.org>" [Unicode]
-    #mail_from = u""
-
-    # "user pwd" if you need to use SMTP AUTH
-    #mail_login = ""
-
-
-    # User interface ----------------------------------------------------
-
-    # The default theme anonymous or new users get
-    theme_default = u'modernized'
-
-
-    # Language options --------------------------------------------------
-
-    # See http://moinmo.in/ConfigMarket for configuration in
-    # YOUR language that other people contributed.
-
-    # The main wiki language, set the direction of the wiki pages
-    language_default = 'en'
-
-    # the following regexes should match the complete name when used in free text
-    # the group 'all' shall match all, while the group 'key' shall match the key only
-    # e.g. FooGroup -> 'all' ==  FooGroup, 'key' == Foo
-    # moin's code will add ^ / $ at beginning / end when needed
-    # You must use Unicode strings here [Unicode]
-    item_dict_regex = ur'(?P<all>(?P<key>\S+)Dict)'
-    item_group_regex = ur'(?P<all>(?P<key>\S+)Group)'
-
-    # Content options ---------------------------------------------------
-
-    # Show users hostnames in RecentChanges
-    show_hosts = 1
-
+# for now, see the wikiconfig.py in the toplevel directory.
+# TODO: put a tested wiki config in here when stuff has stabilized
--- a/docs/todo/todo.rst	Sun Sep 25 18:25:26 2011 +0200
+++ b/docs/todo/todo.rst	Mon Sep 26 02:38:29 2011 +0200
@@ -5,29 +5,6 @@
   tracker (on bitbucket.org) and remove them from here
 
 
-Storage Backends
-================
-
-Mercurial Backend
------------------
-
-Wiki instance pull which leads to merge invalidates Item index files (current revisions 
-index and destroyed revisions index). This files should be recreated from changelog after merge.
-
-Merge does not yet care about merged revisions metadata.
-
-Last API changes (destroy_revision) made storing revision parents in revision metadata invalid.
-Links to parents should be stored now in mutable collection. Index (revisions index) is suitable
-for this task and its record format can be extended to store this values.
-
-GraphInfo action showing revisions history as DAG has to be fixed.
-
-UI lacks actions for serving backend directly (hg serve), pulling data from other instances (hg pull)
-and merging (hg merge). This stuff is rather low-priority, as it can be done in command line very well.
-
-Handy mercurial extensions to ease commit and rename operations from command line  are still missing.
-
-
 DOM Converters
 ==============